检查双精度值是否被赋值为 0.0 的有效方法

DrT*_*arr 7 c++ floating-point double

我知道有很多陷阱与使用等比较具有double的,所以我对如何实现某个值的检查谨慎等于准确 0.0。基本上,我想知道是否从未分配过值,或者是否有意为该值分配0.0了文字。我不想知道它是否接近零(例如 - 0.0000000001)。

所以我在使用val == 0.0或类似的东西之间进行辩论:

bool isZero(double val)
{
    if (val > std::numeric_limits<double>::min()) {
        return false;
    } else if (val < -std::numeric_limits<double>::min()) {
        return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这两种说法会有区别吗?我应该偏爱一个吗?我特别关注下溢场景,其中val == -0.0.

谢谢


我应该将“从未分配”声明澄清为“默认初始化后从未分配”。

Mes*_*kon 4

如果您需要知道浮点变量是否精确0.0-0.0那么使用val == 0.0.

如果您需要知道它是否准确,0.0那么-0.0您必须验证您是否使用 ieee-754 浮点并检查位表示是否全为零。

  • 对于第二种情况,您还可以使用“val == 0.0 &amp;&amp; signbit(val) == 0”。 (2认同)