9

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

某处沿线:

(deftest sqrt-test
   (is (~= 1.414 (Math/sqrt 2)))
4

2 回答 2

11

您需要定义“关闭”。如果您要求小于某个公差的“差异”,您可以使用以下方式滚动您自己的函数<

(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))))

(当然,选择您对相对差异的首选定义)。

然后(partial close? 0.001)将测试公差为 0.001 的近似相等。

要发现公差参数的有用值的限制,您可以使用Math/ulp,这是一种静态方法,它采用双精度并返回它与最小的较大双精度之间的绝对差。

于 2013-07-17T22:42:23.583 回答
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
于 2015-03-28T16:36:07.510 回答