关于c ++:浮点乘以零是否保证产生零?

Is floating point multiplication by zero guaranteed to produce zero?

我知道浮点数具有舍入误差,但是我想知道在某些情况下该误差不适用,例如乘以零。

对于所有浮点数,零乘以任意数字是否等于零?


假:

1
2
0f * NAN == NAN
0f * INFINITY == NAN

还有...

1
0f * -1f == -0f (negative 0f), with 0f == -0f :-)

(在Intel,VC ++上,并且可能在使用IEEE 754-1985浮点的任何平台上)

ideone上的示例(可能在某些Intel兼容平台上使用GCC)


除了@xanatos好的答案之外,请考虑OP的一些中级问题:

I'm wondering if there are certain situations where the (rounding) error does not apply

包括some_double_y = some_double_x * 1.0some_double_y = some_double_x + 0.0的候选者可能永远不会产生舍入错误。

然而,即使是那些由于编译器而令人怀疑的人,也可以考虑FLT_EVAL_METHOD == 2来以更高的精度评估double,其中"将所有操作和常量评估为long double类型的范围和精度"。 在这种情况下,中间some_double_x可能以long double的形式出现,与0.01.0的明显double值不同。