浮点数或重新解释为 UINT 的浮点数之间比较的等效性
Equivalence of comparison between floats or reinterpreted floats as UINTs
简单地比较两个始终为正的浮点数和将它们的二进制表示重新解释为无符号整数后进行比较之间的比较结果会有什么不同吗?
换句话说,给定已知始终为正或零的变量 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 ) {...}
?
不,它不等同于有符号 0 的情况。
float x = 0.0;
float y = -0.0;
如果 x
和 y
都严格为正数,则此方法有效(忽略指针转换中可能未定义的行为并假设您使用联合或 memcpy 来进行类型双关,并假设您不在浮点字节序与整数类型字节顺序不匹配的少数几个奇异平台之一),因为正二进制浮点数具有与其表示相同的顺序。
如果 y
可以是负零,那么这不起作用,因为 0.f < -0.f
为假,但 0x00000000 < 0x80000000
为真。
如果 y
可能是 NaN,那么这不起作用,因为 NaN 的表示比较大于任何正数的表示,而 x < NaN
始终为假。
如果 x
或 y
为负数,显然它不起作用。
简单地比较两个始终为正的浮点数和将它们的二进制表示重新解释为无符号整数后进行比较之间的比较结果会有什么不同吗?
换句话说,给定已知始终为正或零的变量 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 ) {...}
?
不,它不等同于有符号 0 的情况。
float x = 0.0;
float y = -0.0;
如果 x
和 y
都严格为正数,则此方法有效(忽略指针转换中可能未定义的行为并假设您使用联合或 memcpy 来进行类型双关,并假设您不在浮点字节序与整数类型字节顺序不匹配的少数几个奇异平台之一),因为正二进制浮点数具有与其表示相同的顺序。
如果 y
可以是负零,那么这不起作用,因为 0.f < -0.f
为假,但 0x00000000 < 0x80000000
为真。
如果 y
可能是 NaN,那么这不起作用,因为 NaN 的表示比较大于任何正数的表示,而 x < NaN
始终为假。
如果 x
或 y
为负数,显然它不起作用。