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.
- 问我的意思是
all possible float / double values
排除 NaN.
- 查看类似问题:.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 );
}
标准(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.
- 问我的意思是
all possible float / double values
排除 NaN. - 查看类似问题:.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 );
}