0

浮点数很棘手,因为许多自然算术属性不成立。

我认为这个特定的属性仍然存在,但我更愿意询问而不是被难以检测的错误击中。

假设它d是一个任意类型的变量double。我可以假设在以下操作之后:

d *= 0;

以下检查将始终返回true

d == 0

d我想如果是正/负无穷大或NaN ,这将不成立。但是,还有其他我需要注意的问题吗?

  • 我听说在浮点中实际上有两个零,即+0-0。如果d一开始是负数,会d *= 0返回-0吗?如果是这样,它是否等于0
  • 我听说浮点运算不准确。因此,乘以是否可能0会返回类似0.0000001-0.000001不等于的东西0?我的假设是这很可能是不可能的,但我没有足够的知识来支持这个假设,所以我更愿意问。
  • 还有其他我没有预见到的问题吗?
4

1 回答 1

2

简短的回答是肯定的,给定您的具体示例,d 将为 0。这是因为 0 在每个 FP 模型中都有精确表示,因此当您将双精度值乘以值“0”(或“0.0”)时,结果不受舍入/截断错误的影响。

您提到的问题在 FP 算术中发挥作用,因为当您具有有限分辨率时会发生固有的近似。

例如,IEEE-754 浮点标准中值 0.002 的最准确 64 位表示是 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
}

这就是为什么在比较浮点值时几乎总是建议不要使用精确相等的原因。

于 2018-07-15T22:26:17.690 回答