IEEE 754:v *= -1 是否始终保证与 v = -v 相同?

IEEE 754: is v *= -1 always guaranteed to be the same as v = -v?

标准(IEEE 754 / C)是否保证以下代码断言永远不会失败?

int main()
{
    for ( /* all possible float / double values */ )
    {
        v_neg1 = v * -1;
        v_neg2 = -v;
        assert( v_neg1 == v_neg2 );
    }
    return 0;
}

UPD.

  1. 问我的意思是 all possible float / double values 排除 NaN.
  2. 查看类似问题:.NET decimal.Negate vs multiplying by -1

不,这不一定是真的,因为 NaNs 永远不会相互比较。

除此之外,鉴于符号位独立于指数和绝对有效数,我相信它适用于所有普通值。 C 参考 ISO/IEC 60559 / IEEE 754 附录;不幸的是我自己没有标准。

#include <math.h>
#include <assert.h>


int main(void)
{
    double v, v_neg1, v_neg2;

    v = NAN;
    v_neg1 = v * -1;
    v_neg2 = -v;
    assert( v_neg1 == v_neg2 );
}