在Clojure中,测试两个数字是否接近的惯用方法是什么?
大致如下:
(deftest sqrt-test
(is (~= 1.414 (Math/sqrt 2)))
在Clojure中,测试两个数字是否接近的惯用方法是什么?
大致如下:
(deftest sqrt-test
(is (~= 1.414 (Math/sqrt 2)))
<
自定义函数:(defn close? [tolerance x y]
(< (difference x y) tolerance))
差异可能是绝对的地方:
(defn absolute-difference ^double [^double x ^double y]
(Math/abs (double (- x y))))
或相对路径:
(defn relative-difference ^double [^double x ^double y]
(/ (Math/abs (- x y))
(max (Math/abs x) (Math/abs y))))
(选择您偏好的相对差分定义)。
然后(部分关闭?0.001)
将测试精度为0.001的近似相等性。
要发现容忍度参数有用值的限制,可以使用 Math/ulp
,这是一个静态方法,它接受一个double并返回它与最小较大double之间的绝对差异。
clojuree.o=> (approx= 1.41 (sqrt 2) 1e-2)
true
clojuree.o=> (approx= 1.41 (sqrt 2) 1e-4)
false