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

9

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

大致如下:

(deftest sqrt-test
   (is (~= 1.414 (Math/sqrt 2)))
2个回答

12
你需要定义"close"的含义。如果你要求误差小于某个容差值,你可以使用<自定义函数:
(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之间的绝对差异。


5
尽管我很喜欢Michał Marczyk的方法,但请注意在clojure.algo.generic.math-functions中已经定义了名为approx=的函数。以下是示例用法:
clojuree.o=> (approx= 1.41 (sqrt 2) 1e-2)
true
clojuree.o=> (approx= 1.41 (sqrt 2) 1e-4)
false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接