这段代码来自UE4,我在理解它时遇到了一些麻烦。
static FORCEINLINE bool IsNaN( float A )
{
return ((*(uint32*)&A) & 0x7FFFFFFF) > 0x7F800000;
}
(uint32只是一个无符号的int)
第一部分是将float解释为uint32,这是简单的部分,但是为什么要按位使用
0x7FFFFFFF
呢?最后4位告诉我们什么,为什么我们将结果与0x7F800000
进行比较? 最佳答案
该定义遵循IEEE 754标准中提供的NaN定义。
0x7FFFFFFF
是最大值,可以用31位表示。在这种情况下,它只是忽略了位符号,因为:
0x7F800000
是指数字段的位的掩码。
其中带有s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx
的s = 0
(被0x7FFFFFFF
和忽略)和x = 0
等于0x7F800000
。
使用operator >
是因为,如果设置了有效位数中的任何位(任何x
),则结果值将大于0x7F800000
。
为什么要设置它?因为:
资料来源:NaN on Wikipedia。