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