gpt4 book ai didi

unit-testing - clojure.test 应该在一定范围内断言两个不同的 float 相等

转载 作者:行者123 更新时间:2023-12-05 03:05:56 25 4
gpt4 key购买 nike

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

一些测试失败是因为非常接近的 float 被认为是不同的。

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 实际上是同一回事。

最佳答案

找到一个好的解决方案来解决这个问题是我多年前开始使用 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 )))

关于unit-testing - clojure.test 应该在一定范围内断言两个不同的 float 相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50143364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com