如何测试Clojure中两个数字是否接近

Chr*_*ris 6 testing unit-testing clojure

在Clojure中测试两个数字是否彼此接近的惯用方法是什么?

沿着这条线的某个地方:

(deftest sqrt-test
   (is (~= 1.414 (Math/sqrt 2)))
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 8

你需要定义"关闭".如果您要求的差异小于某个容差,您可以使用<以下方法滚动自己的功能:

(defn close? [tolerance x y]
  (< (difference x y) tolerance))
Run Code Online (Sandbox Code Playgroud)

差异可能是绝对的:

(defn absolute-difference ^double [^double x ^double y]
  (Math/abs (double (- x y))))
Run Code Online (Sandbox Code Playgroud)

或亲戚:

(defn relative-difference ^double [^double x ^double y]
  (/ (Math/abs (- x y))
     (max (Math/abs x) (Math/abs y))))
Run Code Online (Sandbox Code Playgroud)

(当然,选择你喜欢的相对差异的定义).

然后(partial close? 0.001)将测试近似相等,容差为0.001.

要发现可以使用的容差参数的有用值的限制Math/ulp,这是一个静态方法,它取一个double并返回它与最小的较大double之间的绝对差值.


Tom*_*ich 5

虽然我喜欢MichałMarczyk的解决方案,但请注意已经存在

大约=

clojure.algo.generic.math-functions中定义的函数.样品用法:

clojuree.o=> (approx= 1.41 (sqrt 2) 1e-2)
true
clojuree.o=> (approx= 1.41 (sqrt 2) 1e-4)
false
Run Code Online (Sandbox Code Playgroud)