我看过像:
这样的帖子What is the most effective way for float and double comparison?
以及其他许多相关帖子。
我在d3js库中看到,它使用以下比较:
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
可以在C / C ++中使用它来对double
和float
进行比较吗?
答案 0 :(得分:7)
以下代码是否足够?
没有
如果没有,为什么?
因为它与==
相同(至少对于非边缘情况,即。)
答案 1 :(得分:2)
这还不够,因为如果a或b是NaN
,它将返回true答案 2 :(得分:1)
这基本上是关于使用“几乎相等”的概念可以某种方式弥补对浮点计算的不充分了解以获得可靠的结果。 “几乎相等”是一种先进的技术;它会经常咬你,因为它不传递(即a
“几乎等于”b
而b
“几乎等于”c
并不意味着a
“几乎等于”c
)。如果您是一名认真的程序员,请学习浮点运算的基础知识。没有人会感到惊讶(1/2)*2)
不是1,但是人们不知道(1.0/10.0)*10.0
也不是1(除非你的系统有十进制浮点数),而完全同样的道理。这是教育的失败,但是受过严格教育并不意味着你不能学习它。 (咆哮结束)
答案 3 :(得分:0)
与容差进行比较的想法是,两个几乎完全相同的值可能需要被认为是相同的。如果您有2.000000000000
和2.000000000001
,那么这些是否相同?如果它们应该是那么你的代码就会失败。
答案 4 :(得分:0)
您的错误是,您阅读了{/ 3}}
diff = A - B;
return (diff < EPSILON) && (-diff > EPSILON);
并且,您将EPSILON = 0
并将其转换为
if (!(a > b) && !(a < b))
您不应将EPSILON
视为0
。因为你应该考虑一点错误是浮点/双倍比较,我们称之为EPSILON
。
答案 5 :(得分:0)
你真的需要阅读这份文件:
https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/paper.pdf
这是Golberg的论文=无论每个程序员都应该知道浮点数。