我正在使用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.0
和0.999
实际上是相同的。
答案 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 )))