首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clojure.test应该在一定范围内断言两个不同的浮点数相等。

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

Stack Overflow用户
提问于 2018-05-02 20:50:22
回答 2查看 551关注 0票数 3

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

有些测试失败是因为非常接近的浮点数被认为是不同的。

代码语言:javascript
复制
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()来实现这一点。

Note

在我的具体例子中,1.00.999实际上是一回事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-02 20:55:23

找到一个很好的解决这个问题的方法,是很多年前我开始使用Clojure时遇到的第一个问题之一。我正是为此创建了rel=函数在图佩洛图书馆

代码语言:javascript
复制
  (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."

在这里,它正在发挥作用:

代码语言:javascript
复制
(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 )))
票数 4
EN

Stack Overflow用户

发布于 2022-01-12 22:26:13

我没有在clojure.test的API中看到任何东西,也不想看到其他依赖项,所以我编写了一个函数close-to

代码语言:javascript
复制
(ns floats-test
  (:require [clojure.test :refer :all]))

(defn abs
  [x]
  (max x (- x)))

(defn close-to
  [x y epsilon]
  (<= (abs (- x y)) epsilon))

(deftest floats...
  (testing "floats are equal"
    (is      (close-to 0.000000001 0.00000002  1e-7)))
  (testing "floats are equal (other direction)"
    (is      (close-to 0.000000002 0.00000001  1e-7)))
  (testing "floats aren't equal"
    (is (not (close-to 0.000000001 0.000001    1e-7))))
  (testing "floats aren't equal (other direction)"
    (is (not (close-to 0.000001    0.000000001 1e-7)))))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50143364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档