浮点数很棘手,因为许多自然算术属性都不成立。
尽管如此,我认为这个特定的属性仍然成立,但我更愿意询问,而不是被难以检测的错误所打击。
假设d
是double
类型的任意变量。我可以假设在以下操作之后:
d *= 0;
以下检查将始终返回true
?
d == 0
我想如果d
是正/负无穷大或NaN,这将不成立。但是,我还需要注意其他问题吗?
+0
和-0
。如果d
一开始是负数,那么d *= 0
会返回-0
吗?如果是,它会等于0
吗
0
会返回类似0.0000001
或-0.000001
的不等于0
的值?我的假设是这可能是不可能的,但我没有足够的知识来支持这个假设,所以我更愿意问简单的答案是肯定的,给定您的具体示例,d将为0。这是因为0在每个FP模型中都有一个精确的表示,因此当您将一个双精度值乘以值"0"(或"0.0"(时,结果不会出现舍入/截断错误。
您提到的问题在FP运算过程中发挥作用,这是当您具有有限分辨率时发生的固有近似的结果。
例如,IEEE-754浮点标准中0.002值的最准确的64位表示是0x3F0624D_DF1A9FC,其总计为2.000000000000000004163336342344E-3(来源:http://www.binaryconvert.com/convert_double.html)
值0不会遭受这种精度损失。然而,很明显,如果你要做这样的事情,你会遇到问题:
double d = 0.009;
d -= (0.001 * 9);
if (d == 0)
{
//This check will fail
}
这就是为什么在比较浮点值时几乎总是建议不要使用精确相等。