浮点数或重新解释的浮点数之间的比较等同于UINT

时间:2015-03-17 11:18:25

标签: c floating-point ieee-754

在将二进制表示重新解释为无符号整数之后,通过简单地比较两个始终为正的浮点数并比较它们之间的比较结果会有什么不同吗?

换句话说,给定变量float x,y;已知总是正数或零并且知道用于存储32位浮点数的ieee-754标准,我可以假设这种比较:

float x,y;
...
if ( x < y ) {...}

总是等同于:

float x,y;
unsigned int uix, uiy;
...
uix = *(unsigned int*)&x;
uiy = *(unsigned int*)&y;

if ( uix < uiy ) {...}

2 个答案:

答案 0 :(得分:3)

如果xy都是严格正数,那么这是有效的(忽略指针转换中可能未定义的行为,并假设您使用了union或memcpy来代替类型惩罚,并且假设您不是浮点数与整数类型不匹配的少数离奇平台之一,因为正二进制浮点数与它们的表示具有相同的排序。

如果y可能为负零,那么这不起作用,因为0.f < -0.f为false,但0x00000000 < 0x80000000为真。

如果y可能是NaN,那么这不起作用,因为NaN的表示比任何正数的表示要大,而x < NaN总是为假。

显然,如果xy为负数,它就不起作用。

答案 1 :(得分:1)

不,它与签名0的情况不相同。

float x = 0.0;
float y = -0.0;

http://ideone.com/V7IYwL