可能是重复问题:
如何进行浮点数比较?
在C++中,不建议将double和double字���量进行相等性比较,因为我猜这取决于编译器?
更准确地说,不能比较硬编码的double(源代码中的文字)和应计算的double,因为计算结果的最后一个数字可能因编译器而异。这是否有标准化规定?
我听说在Knuth的TeXbook中提到了这一点,是真的吗?
如果以上都是正确的,解决方案是什么?
可能是重复问题:
如何进行浮点数比较?
在C++中,不建议将double和double字���量进行相等性比较,因为我猜这取决于编译器?
更准确地说,不能比较硬编码的double(源代码中的文字)和应计算的double,因为计算结果的最后一个数字可能因编译器而异。这是否有标准化规定?
我听说在Knuth的TeXbook中提到了这一点,是真的吗?
如果以上都是正确的,解决方案是什么?
1.0/10.0
为例,结果本应该是0.1
,但实际上不是,因为0.1
无法在浮点格式中精确表示。因此,实际结果会略有不同。对于无数其他操作也是如此,所以这个观点与const doubles无关,而是与不期望结果精确有关。如果您执行某些计算,其中结果应该是1.0
,那么您不应该将其与1.0
进行相等测试,因为舍入误差可能意味着它实际上是0.9999999997
。1.0
。如果足够接近,我们就假设“它已经足够好了”,并将其视为结果为1.0。1/3
。你必须在某个点上四舍五入,并且失去精度(0.333333...)。同样,在二进制中(浮点数和双精度数使用的基数),你也无法精确地表示 1/10
。 - jalfdouble A = somethingA();
double B = somethingB();
double epsilon = 0.00001;
if (abs(A - B) < epsilon)
doublesAreEqual();
[编辑] 还可以参考这个问题:浮点数比较的最有效方法是什么?。
std::numeric_limits<T>::epsilon()
函数来确定类型 T 可以表示的最小可能与 1.0 的差异;但是不要将其用于上述检查(因为 epsilon 对于更高的指数将 不 可表示),仅供参考。 - sehedouble calcSomeStuf();
if ( calcSomeStuf() == 0.1 ) { ...}
这是一个不好的想法。
然而:
const double epsilon = 0.005
double calcSomeStuf();
if ( abs(calcSomeStuf() - 0.1) < epsilon ) { ...}
这样做更安全(特别是考虑到0.1无法准确表示为双精度)
这是必要的,因为在累加浮点运算时会出现舍入误差,并且由于浮点数的本质,不是所有数字都可以准确表示。