浮点数乘以0总是得到0吗



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

尽管如此,我认为这个特定的属性仍然成立,但我更愿意询问,而不是被难以检测的错误所打击。

假设ddouble类型的任意变量。我可以假设在以下操作之后:

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
    }
    

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

    相关内容

    • 没有找到相关文章

    最新更新