问题标签 [floating-point-comparison]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
67 浏览

perl - 在 Perl 中,为什么 100*18.35 不等于 1835?

当我运行以下 Perl 单行代码时:

我明白了

这是为什么?

0 投票
1 回答
38590 浏览

python - Python-如何在 x 和 y 之间进行 if 语句?

我最近一直在接触 Python,因为 C++ 很有趣,但 Python 似乎有点酷。只要输入在某个数字范围之间,我就想让 Python 做一些事情。

问题出现在我做 elif 语句时,我做不到,所以只要等级在 65 到 89 之间,Python 只会打印“做得很好”语句。你将如何处理数字范围?

0 投票
6 回答
5408 浏览

c++ - 浮点相等

众所周知,在比较浮点值时必须小心。通常,我们不使用==,而是使用一些基于 epsilon 或 ULP 的相等性测试。

但是,我想知道,是否有任何情况下,使用时==完全没问题?

看看这个简单的代码片段,哪些情况可以保证成功?

注意:我已经检查过thisthis,但它们并未涵盖(所有)我的案例。

注意2:似乎我必须添加一些附加信息,因此答案在实践中可能很有用:我想知道:

  • C++ 标准是怎么说的
  • 如果 C++ 实现遵循 IEEE-754 会发生什么

这是我在当前标准草案中找到的唯一相关声明:

浮点类型的值表示是实现定义的。[注:本文档对浮点运算的准确性没有要求;另见 [support.limits]。——尾注]

那么,这是否意味着,即使是“案例 a)”也是实现定义的?我的意思是,l1==l1绝对是浮点运算。那么,如果一个实现是“不准确的”,那么可能l1==l1是错误的吗?


我认为这个问题不是Is floating-point == ever OK? . 这个问题没有解决我要问的任何情况。相同的主题,不同的问题。我想有专门针对案例 a)-d) 的答案,我无法在重复的问题中找到答案。

0 投票
1 回答
67 浏览

c# - 浮点数乘以 0 是否总是得到 0?

浮点数很棘手,因为许多自然算术属性不成立。

我认为这个特定的属性仍然存在,但我更愿意询问而不是被难以检测的错误击中。

假设它d是一个任意类型的变量double。我可以假设在以下操作之后:

以下检查将始终返回true

d我想如果是正/负无穷大或NaN ,这将不成立。但是,还有其他我需要注意的问题吗?

  • 我听说在浮点中实际上有两个零,即+0-0。如果d一开始是负数,会d *= 0返回-0吗?如果是这样,它是否等于0
  • 我听说浮点运算不准确。因此,乘以是否可能0会返回类似0.0000001-0.000001不等于的东西0?我的假设是这很可能是不可能的,但我没有足够的知识来支持这个假设,所以我更愿意问。
  • 还有其他我没有预见到的问题吗?
0 投票
2 回答
4533 浏览

python - 检查特定的浮点值是否在 Python/numpy 的列表/数组中

在检查浮点数之间的相等性时需要小心,并且通常应该考虑到容差,例如使用numpy.allcose

问题1:使用“in”关键字检查特定浮点数的出现是否安全(或者是否有类似的关键字/函数用于此目的)?例子:

问题 2:如果不是,那么整洁的解决方案是什么?

0 投票
2 回答
1732 浏览

python - 如何在 Python 中评估两个数字是否足够接近?

我有两个号码——

3.125000 MB 和 2.954880 MB。

我想比较它们,它应该返回 True,因为它们几乎是 3Mbytes。我如何在 Python3 中这样做。

我试着做math.isclose(3.125000,2.954880, abs_tol=0.1)

但是,这会返回False。我真的不明白如何把宽容放在这里。

https://docs.python.org/3/library/math.html

我正在使用 Python 3.5.2。

预期的结果是True。实际结果是False

0 投票
1 回答
1082 浏览

c++ - 在 Catch2 中检查近似零的规范方法是什么?

与 Catch2 中的近似零进行比较的规范方法是什么?

我发现这种方式的容差为 1e-12,但尚不清楚这是最好的方式:

我不是在问如何比较一般的浮点数。我知道这不是一个简单的问题。我在问如何在预先知道一定容差的情况下使用 Catch2。

以下内容不起作用,因为相对(epsilon)误差在零附近表现不佳:


其他可能的(不太好)(替代品似乎是

0 投票
4 回答
1142 浏览

java - Java List.contains 对象具有双精度和容差

假设我有这个课程:

我有一个类似的测试:

现在,如果 getStudents() 方法将 Peter 的 GPA 计算为 3.8899999999994,那么该测试将失败,因为 3.8899999999994 != 3.89。

我知道我可以对单个双精度/浮点值进行容差断言,但是有没有一种简单的方法可以使用“包含”来完成这项工作,这样我就不必单独比较 Student 的每个字段(我将编写许多类似的测试,而我将要测试的实际类将包含更多字段)。

我还需要避免修改有问题的类(即学生)来添加自定义相等逻辑。

此外,在我的实际课程中,会有其他双精度值的嵌套列表需要使用容差进行测试,如果我必须单独断言每个字段,这将使断言逻辑更加复杂。

理想情况下,我想说“告诉我这个列表是否包含这个学生,并且对于任何浮点/双字段,与 .0001 的容差进行比较”

任何使这些断言保持简单的建议都值得赞赏。

0 投票
1 回答
233 浏览

c++ - 我们可以使用 !islessgreater(float a, float b) 来检查 a==b 给定 a 和 b 都不是 nan

要检查两个浮点变量是否相等,我们不能使用 a==b 之类的东西。但是如何使用头文件中的 islessgreater() 函数呢?

从 C++11 开始,有以下三个重载

编辑#1 我知道有一些解决方法可以检查很多人的两个浮点变量的相等性。例如, Boost 中的浮点比较 如何正确、标准地比较浮点数?

我关心的是我们是否可以使用 C++11 中的标准函数 islessgreater() 来检查 (float a == float b) 与否?例如

0 投票
3 回答
105 浏览

c++ - 如何处理 C++ 数学表达式中的浮点比较,从而可以处理舍入错误?

让我进一步解释一下。我正在编写一个代码来计算游泳池在以填充率填充一段时间后的水量。采用的输入是length,以英尺为单位,以秒为单位填充水池width的时间美制加仑/分钟为单位的水池中的注水率,以美制加仑为单位的水池中已经存在的水量。根据这些信息,我通过将长度、宽度和深度相乘并将其转换为美制加仑来计算总池水容量。depthtimeToFillPoolfillingRatepoolCurrWaterAmounttotalPoolCapacity

我问用户池中已有多少水,然后计算并向用户显示适当的消息,例如如果池已满或在给定时间内注满的水将超过池容量,是否可以注满水?

我假设输入的所有值都是正数或等于零(如果允许为零)。

问题是存储的内部值totalPoolCapacity是 89.76624 并且由于setprecision(2)它将值四舍五入到 89.77 所以当我输入 89.77 它不接受它作为正确的值,尽管根据显示消息它应该是正确的值。我不想向用户展示全部价值。

还请解释如何处理这个计算setprecision(2) (totalPoolCapacity - poolCurrWaterAmount) / fillingRate

EPSILON以及比较浮点数有什么好处。

因此,计算并显示给用户的时间不会影响具有舍入效果的整体计算。这就是用户所看到的,程序通过操纵浮点数的内部表示及其四舍五入效果来根据该行为行事。