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++ 允许以比标称类型更精确的方式计算表达式。当通过强制转换分配或转换值时,将丢弃这种多余的精度。因此比较可能表明表达式是非零的,即使将它分配给一个对象会在对象中产生零。
使用“==”运算符确定 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++ 允许以比标称类型更精确的方式计算表达式。当通过强制转换分配或转换值时,将丢弃这种多余的精度。因此比较可能表明表达式是非零的,即使将它分配给一个对象会在对象中产生零。