__float_as_int重新解释float为int,但我不知道重新解释int可以用来比较float值
__float_as_int(floatA) > __float_as_int(floatB) => floatA > floatB
Run Code Online (Sandbox Code Playgroud)
和
floatA > floatB => __float_as_int(floatA) > __float_as_int(floatB)
Run Code Online (Sandbox Code Playgroud)
它是否正确?
您可以使用整数比较直接替换'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 时为32int),0x80000001(解释为时为- (2 32 -1)int)至0xff800000负无穷大(解释为时为-8388608 int).
由于比较float通常至少与比较一样快int,因此通常没有理由以float这种方式替换比较.可能有意义的一种情况是程序是否编译,-ftz=true但需要与非正规支持进行隔离比较.
在类似的方法中,还可以double通过提取操作数的最高32位__double2hiint()并比较得到的整数来替换一些与整数比较的比较.这种方法主要适用于与简单常数的比较.它具有明确的性能优势,如果您查看math_functions_dbl_ptx3.hCUDA 6.5 中的头文件,您会发现该技术应用得非常广泛.
| 归档时间: |
|
| 查看次数: |
498 次 |
| 最近记录: |