IEEE 754:v *= -1 总是保证与 v = -v 相同吗?

Pav*_*kin 3 c floating-point double ieee-754

标准(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;
}
Run Code Online (Sandbox Code Playgroud)

更新。

  1. 当问我的意思是all possible float / double values 排除 NaNs
  2. 请参阅类似问题:.NET decimal.Negate 与乘以 -1

Ant*_*ala 5

不,这不一定是真的,因为NaN从不相互比较。

除此之外,鉴于符号位独立于指数和绝对有效数,我相信它适用于所有普通值。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 );
}
Run Code Online (Sandbox Code Playgroud)