问题标签 [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 投票
3 回答
18265 浏览

r - 相同(x,y)和isTRUE(all.equal(x,y))有什么区别?

isTRUE(all.equal(x, y))测试和测试有什么区别identical(x, y)吗?

帮助页面说:

不要在 'if' 表达式中直接使用 'all.equal' - 如果合适,可以使用 'isTRUE(all.equal(....))' 或 'identical'。

但“如果合适”让我怀疑。我如何决定这两者中的哪一个是合适的?

0 投票
4 回答
34947 浏览

python - 比较熊猫列中的浮点数

我有以下数据框:

我需要添加一列,指示实际信用> = min_required_credit 的位置。结果将是:

我正在执行以下操作:

然而,第 3 行(0.4 和 0.4)不断导致 False。在各个地方研究了这个问题之后,包括:在 Python 中比较浮点数的最佳方法是什么?我仍然无法让它工作。每当两列具有相同的值时,结果为 False,这是不正确的。

我正在使用 python 3.3

0 投票
1 回答
135 浏览

floating-point - 比较浮点数的方法之间的区别

判断两个浮点数是否相同的方法似乎有很多。以下是我发现的一些示例:

  1. fabs(x - y) < n * FLT_EPSILON * fabs(x)或者fabs(x - y) < n * FLT_EPSILON * fabs(y)

  2. fabs(x - y) < n * FLT_EPSILON * fabs(x + y)

  3. fabs(x - y) < n * FLT_EPSILON * fabs(x + y) || fabs(x - y) < FLT_MIN)

  4. fabs(x - y) / sqrt(x * x + y * y + FLT_EPSILON * FLT_EPSILON) < n * FLT_EPSILON

我真的对他们感到困惑。假设有一个比较两个浮点数的最佳方法,这是最快且最准确的,其他方法甚至不应该存在。所以这些不同的方式肯定各有优劣。

我的问题是:哪种方法最快/最准确/最实用

参考链接:

http://accu.org/index.php/journals/1558(1和 4)

https://stackoverflow.com/a/10335601/5399734(2和3)


澄清:至少,我不认为“最快/最准确”主要是基于意见的。

0 投票
2 回答
99 浏览

python - 为什么比较具有相同值的两个属性类型`float`和`int`在Python中得到`False`?

让我们考虑下面的代码

代码:

输出:

但是,如果我将在线代码更改11foo = Foo(2),则输出将变为:

你会看到输出a = 2.0 b = 2 "a == b" -> False非常奇怪。我想我可能会误解 Python 中 OOP 的一些概念。请向我解释为什么会发生这种意外输出以及如何解决此问题。

0 投票
2 回答
188 浏览

c++ - 用于缓存昂贵计算的浮点相等

关于期望由单独计算产生的两个浮点数完全相等的危险,已经有很多问题和答案,因为浮点数不是实数。这个问题不是关于基于相等性检查的正确性,而是关于基于它的缓存。

想象一下你有这样的代码:

在这种情况下,相等比较纯粹是为了防止做多余的工作。如果输入不变,我们将避免再次进行昂贵的计算(我们假设昂贵的函数是确定性的,并且它的其他输入没有改变)。

如果两者真的相等(这意味着如果我们可以用实数而不是浮点数计算它们就会相等)但被错误地检测到不相等,在最坏的情况下,我们会冗余地进行昂贵的计算,但我们的程序的答案仍然是正确的。AFAIK,如果计算是在比浮点数的内存表示更宽的寄存器中完成的(例如,在启用 80 位 fp 寄存器时在 32 位 x86 上),它们只能错误地比较相等,并且在转换为内存表示后它们会发生两者按位相等。在这种情况下,差异必须超出内存表示的精度,对于对我来说很重要的比较,它必须低于 epsilon,因为否则我会使用更广泛的类型,比如 double。

所以我要断言这种使用浮点相等是安全的。所以第一个问题是,我错了吗?

其次,如果我们假设它是安全的,我想避免错误地返回 true,因为它会导致昂贵的计算。在寄存器比内存表示更宽的机器上避免这种情况的一种方法是使用 memcmp 强制它比较内存表示(NaN 的语义不会完全相同,现在它将与完全相同的按位实例进行比较本身,但对于缓存这是一种改进,或者对于 +0 和 -0 但可能是特殊情况)。但是,该 memcmp 将比寄存器中的浮点比较慢。有没有办法检测平台何时具有更宽的寄存器,所以我可以 #ifdef 或类似的方法在安全的平台上获得优化的实现?

0 投票
3 回答
4379 浏览

c++ - 为什么发布/调试对 std::min 有不同的结果?

这是测试程序:

在调试中,我得到:

在发布中,我得到:

为什么我会在 Release 中得到与 Debug 不同的结果?

我已经检查了 Stack Overflow post Use of min and max functions in C++,它没有提到任何发布/调试差异。

我正在使用 Visual Studio 2015。

0 投票
1 回答
312 浏览

c++ - 使用别名与整数表示和 ULP 正确比较双精度数

我试图避免使用 epsilon 比较来比较浮点类型。我能想出的最佳解决方案使用了 ULP 的差异(最后的单位),尽管本文使用整数表示有一个更好的解决方案(请///指出我自己的评论):

但是,我似乎无法以支持双打的方式重新格式化代码。我什至阅读了这里的解释。

有谁知道解决这个问题的最佳方法是什么?


在任何人决定将此标记为重复之前:不要,因为唯一类似的问题是针对 javascript 的,而 C++ 的答案是:

它不使用 ULP,而是某种绑定,我不确定是什么-9223372036854775808LL - aInt(也许 int64 溢出的地方)。

0 投票
1 回答
2811 浏览

floating-point - 为什么我不能在标准 ML 中比较实数?

  1. 为什么不起作用1.0 = 2.0?不是真正的平等类型吗?

    它给出了错误:

    /li>
  2. 为什么模式中的实数不能像这样工作?

    它给出了错误:

    /li>
0 投票
1 回答
3691 浏览

c++ - 在 C++ 中,<、== 和 > 中的一个是否保证在浮点数上为真?

在 C++ 中,我是否可以保证,对于任何给定的float aand float b,一个且只有一个a < b, a == banda > b是真的?

如果这在编译器和平台之间有所不同,我对 x86 上的 Visual C++ 很感兴趣。

0 投票
3 回答
193 浏览

python - 如何一次比较两个数字接近度的多个列表?

假设我有 4 个列表:

我如何 1) 比较列表,例如 A,BB,CC,DA,C 等等 2) 如果元素为 +/-0.2 则返回 true ?

我的想法是附加列表有一个 for 循环遍历所有。

但后来我被困住了,因为如果我这样做了

显然它不起作用。有没有办法在不重复的情况下遍历列表并同时进行比较?

提前致谢