【发布时间】: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