双精度或浮点比较
double or float comparison
我看到过这样的帖子:
浮点和双精度比较最有效的方法是什么?
比较两个浮点数
和许多其他相关的帖子。
我在d3js库中看到,它使用以下比较:
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
可以在C/c++中使用这个来比较double
和float
吗?
号下面的代码是否足够?
如果没有,为什么?
因为它与==
相同(至少对于非边缘情况,即)
这是不够的,因为如果a或b是NaN,则返回true
这基本上是关于使用"几乎相等"可以在某种程度上弥补对浮点计算了解不够而无法获得可靠结果的概念。"几乎相等"是一种先进的技术;它经常会咬你,因为它是不是传递的(也就是说,a
"几乎等于"b
和b
"几乎等于"c
并不意味着a
"几乎等于"c
)。如果你是一个认真的程序员,学习浮点工作的基础知识。没有人对(1/2)*2)
不是1感到惊讶,但不知何故,人们不明白(1.0/10.0)*10.0
也不是1(除非您的系统有十进制浮点数),对于来说,也是同样的原因。这是教育的失败,但被教得不好并不意味着你学不到。(结束)
与容差进行比较的意思是,两个几乎完全相同的值可能被认为是相同的。如果你有2.000000000000
和2.000000000001
,它们应该相等吗?
你的错误是,你读了一篇有
diff = A - B;
return (diff < EPSILON) && (-diff > EPSILON);
,然后把EPSILON = 0
改成
if (!(a > b) && !(a < b))
你不应该假设EPSILON
是0
。因为你应该考虑一个位错误是浮点/双精度比较,我们称之为EPSILON
。
你真的需要看看这份文件:
https://ece.uwaterloo.ca/dwharder/NumericalAnalysis/02数字/双/paper.pdf
这是Golberg的论文
相关文章:
- 为什么我的比较运算符不比较我的点长和双精度值?
- 当两个相等的双精度的相对比较不起作用时,我该怎么办?
- 将双精度与整数进行比较
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 将当前时间 simTime.dbl() 与以前存储的双精度值进行比较并不总是给出正确的答案......为什么?
- Xcode 错误:指针和双精度之间的比较
- 使用具有整数表示和 ULP 的混叠正确比较双精度
- 关于在C/C++中比较整数和浮点/双精度
- C(++) 中双精度的排序/比较不稳定
- 比较两个双精度值但结果很奇怪
- 什么更贵?读取或比较整数,双精度
- 比较双精度和整数,不进行转换或转换
- 比较两个包含双精度的文件
- 两个双精度值的 C++ 比较无法正常工作
- 如何让数组将其值与双精度值进行比较
- 比较双精度堆栈导致Always Equal
- 正、负两个双精度的比较
- 比较两个不同的双精度数时返回true
- 比较双精度的简单方法
- 如何比较长型和双精度型