【问题标题】:Valid way to check that a double has been assigned a value of 0.0检查双精度值是否为 0.0 的有效方法
【发布时间】:2020-09-21 11:51:01
【问题描述】:

我知道将相等比较器与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;
}

这两种说法有什么区别吗?我应该偏爱一个吗?我特别关心val == -0.0 的下溢场景。

谢谢


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

【问题讨论】:

  • 1) 还要考虑std::fpclassify(val) == FP_ZERO。 2) 小心 NaN。您的 isZero 为 NaN 返回 true
  • 还要注意“从未分配”的事情...未初始化的局部变量将具有 indeterminate 值,并使用这些值(在 any方式)导致未定义的行为。
  • 为什么关注-0.0?这是一个有效的零,就像0.0。这不仅是下溢的结果,例如-1.0*0.0 == -0.0.
  • 无法判断 double 是否已初始化,也无法判断初始化程序是文字还是其他表达式。
  • == 完全按照您的想法进行。人们告诉你不要使用 == 的原因是,通常确实想知道某物是否接近于零。

标签: c++ floating-point double


【解决方案1】:

如果您需要知道浮点变量是否恰好是0.0-0.0,那么使用val == 0.0 没有任何问题。

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

【讨论】:

  • 第二种情况也可以使用val == 0.0 &amp;&amp; signbit(val) == 0
  • 您可以添加将val 初始化为NAN 将允许稍后确定它是否被故意设置为零。
猜你喜欢
  • 2015-07-30
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2019-07-09
  • 2020-12-23
相关资源
最近更新 更多