【发布时间】:2015-10-22 16:33:45
【问题描述】:
我读到浮点数/双精度数相等应该使用一个间隔来实现(由一些 epsilon 给出):
bool aresame(double a, double b)
{
return (fabs(a-b) < EPSILON);
}
我可以使用它们的任何预定义 EPSILON 值还是我必须自己定义它,例如0.0000000001?
【问题讨论】:
-
这是一种“总会导致错误”的误解。例如,浮点值与整数值总是可以精确比较。为避免不得不记住无数看起来随意的规则,请创建一个浮点数的心智模型,将其作为整数乘以 2 的幂,并将其中大部分推理出来。
-
你的意思可能是
fabs,而不是fmod -
@Cheersandhth.-Alf “浮点值与整数值始终可以精确比较” - 作为一般性陈述,并且在舍入误差的情况下会产生误导,就像过去一样一个阈值只有每隔一个整数,然后每隔四个等可以被编码,所以例如
a + (b + c)可能不等于(a + b) + c,尽管它们都是整数。 -
我将把this link to a Blog留在这里,它是一个很好的阅读。
-
@TonyD:是的,这可能是一个更准确的说法。超出您所说的门槛,这些价值观不再是不可或缺的。并且要知道一个值是整数,必须知道该值的计算历史。这就是为什么我建议对事物有一个好的心理模型。那么这样的信息似乎不再那么随意了(希望如此)。
标签: c++