C++ 中零初始化值的浮点数比较

Float comparison with zero-initialised value in C++

使用“==”运算符确定 C++ 中的双精度变量自初始化为 0.0 后是否已更改是否安全?

出于性能原因,我想避免在嵌套 for 循环内重新计算已经计算过的值。

如果认为不安全: 这会导致误报(即表达式 returns 为真,尽管值不等于 0.0)、假阴性(即表达式 returns 为假,尽管值确实为 0.0)或 both/undetermined行为?

我正在使用 C++-14 和 GNU C++ 编译器 v5.4。

在 C++ 中,当且仅当 x 为零时,表达式 x == 0. 的计算结果为真。

唯一可能出现假阳性或假阴性的感觉是:

  • x 是当理想的精确数学结果不为零时产生零的计算结果,反之亦然。换句话说,问题是 x 不包含你想要的值,而不是与零比较不能正常工作。
  • 比较使用浮点表达式,而不是简单的对象 x,如 x/y == 0.。 C++ 允许以比标称类型更精确的方式计算表达式。当通过强制转换分配或转换值时,将丢弃这种多余的精度。因此比较可能表明表达式是非零的,即使将它分配给一个对象会在对象中产生零。