双精度或浮点比较

double or float comparison

本文关键字:比较 双精度      更新时间:2023-10-16

我看到过这样的帖子:

浮点和双精度比较最有效的方法是什么?

比较两个浮点数

和许多其他相关的帖子。

我在d3js库中看到,它使用以下比较:

  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;

可以在C/c++中使用这个来比较doublefloat吗?

下面的代码是否足够?

如果没有,为什么?

因为它与==相同(至少对于非边缘情况,即)

这是不够的,因为如果a或b是NaN,则返回true

这基本上是关于使用"几乎相等"可以在某种程度上弥补对浮点计算了解不够而无法获得可靠结果的概念。"几乎相等"是一种先进的技术;它经常会咬你,因为它是不是传递的(也就是说,a"几乎等于"bb"几乎等于"c并不意味着a"几乎等于"c)。如果你是一个认真的程序员,学习浮点工作的基础知识。没有人对(1/2)*2)不是1感到惊讶,但不知何故,人们不明白(1.0/10.0)*10.0也不是1(除非您的系统有十进制浮点数),对于来说,也是同样的原因。这是教育的失败,但被教得不好并不意味着你学不到。(结束)

与容差进行比较的意思是,两个几乎完全相同的值可能被认为是相同的。如果你有2.0000000000002.000000000001,它们应该相等吗?

你的错误是,你读了一篇有

   diff = A - B;
   return (diff < EPSILON) && (-diff > EPSILON);

,然后把EPSILON = 0改成

if (!(a > b) && !(a < b))

你不应该假设EPSILON0。因为你应该考虑一个位错误是浮点/双精度比较,我们称之为EPSILON

你真的需要看看这份文件:

https://ece.uwaterloo.ca/dwharder/NumericalAnalysis/02数字/双/paper.pdf

这是Golberg的论文