__float_as_int
将float
重新解释为int
,但我不知道重新解释的int
可用于比较float
值
__float_as_int(floatA) > __float_as_int(floatB) => floatA > floatB
和
floatA > floatB => __float_as_int(floatA) > __float_as_int(floatB)
这是正确的吗?
答案 0 :(得分:5)
您可以直接替换' float'与整数比较进行比较,但仅适用于类似符号的数字。这对于零,非正规,正常或无穷大的操作数都能正常工作,但如果一个或两个操作数都是NaN则不行。根据定义,NaN是无序的,但整数比较对这些编码强加了顺序。对于非正规,您也不会获得任何从零到零的行为。
如果两个操作数都是正数,并且您想要将float
个操作数与rel-op>
进行比较,其中<rel-op>
是==, !=, <, >, <=, >=
之一,只需使用
if (__float_as_int(a) <rel-op> __float_as_int(b))
因为位模式的范围从0x00000000
开始为正零,超过0x00000001
为最小非标准,0x00800000
为最小法线,0x7f7fffff
为最大法线,为无限0x7f800000
。
如果两个操作数均为负数,则必须交换比较中的操作数,
if (__float_as_int(b) <rel-op> __float_as_int(a))
因为位模式的范围从0x80000000
为负零(-2 32 ,当解释为int
)时,超过0x80000001
( - ( 2 32 -1)当被解释为int
)到0xff800000
时为负无穷大(当解释为int
时为-8388608)。
由于float
上的比较通常至少与int
上的比较一样快,因此通常没有理由以这种方式替换float
比较。可能有意义的一种情况是程序是否使用-ftz=true
进行编译,但需要与非正规支持进行隔离比较。
在类似的方法中,还可以通过用double
提取操作数的最高32位来比较一些__double2hiint()
与整数比较的比较,并比较得到的整数。这种方法主要适用于与简单常数的比较。它具有明显的性能优势,如果您查看CUDA 6.5中的头文件math_functions_dbl_ptx3.h
,您会发现该技术的应用非常广泛。