clojure.test应该在一定范围内断言两个不同浮点数的相等性

时间:2018-05-02 20:50:22

标签: unit-testing clojure

我正在使用clojure.test进行单元测试。

部分测试失败,因为非常接近的浮点数被视为不同。

expected: (= expected result)
  actual: (not (= 1.0 0.9999999999999998))

expected: (= expected result)
  actual: (not (= 0.5 0.4999999999999999))

我需要指示clojure.test了解(= 0.9999 1.0)是真的。

例如,使用NUnit,我可以使用Is.EqualTo().Within()来实现此目的。

注意

在我的具体情况中,1.00.999实际上是相同的。

1 个答案:

答案 0 :(得分:2)

找到一个解决这个问题的好方法是我多年前开始与Clojure合作时遇到的第一个问题。我为此目的创建了rel=函数in the Tupelo library

  (rel= val1 val2 & opts)  
  "Returns true if 2 double-precision numbers are relatively equal, 
  else false. Relative equality is specified as either (1) the N 
  most significant digits are equal, or (2) the absolute difference 
  is less than a tolerance value.  Input values are coerced to double 
  before comparison."

这里有效:

(ns tst.demo.core
  (:use demo.core tupelo.core tupelo.test))

(dotest
  (is   (rel=   123450000   123456789  :digits 4 )) ; .12345 * 10^9
  (isnt (rel=   123450000   123456789  :digits 6 ))
  (is   (rel= 0.123450000 0.123456789  :digits 4 )) ; .12345 * 1
  (isnt (rel= 0.123450000 0.123456789  :digits 6 ))

  (is   (rel=  1  1.001  :tol 0.01   )) ; :tol value is absolute error
  (isnt (rel=  1  1.001  :tol 0.0001 )))