如何判断浮点数是SNAN还是QNAN

时间:2015-04-16 05:44:07

标签: c++ c gcc assembly ieee-754

我想弄清楚如果浮点数是QNAN还是SNAN,如何打印出来。我已经将这些位分成了signBit exponentBit和FractBits。

unsigned int sign = (i & 0x80000000) >> 31;
unsigned int exponent = (i & 0x7f800000) >> 23;
unsigned int fraction = (i & 0x007FFFFF);
printf("signBit %d, expBits %d, fractBits 0x%08X\n",sign, exponent, fraction);

2 个答案:

答案 0 :(得分:8)

GNU provides设施recently standardized

  

宏:int issignaling (float-type x)

     

初步:| MT-Safe | AS-Safe | AC-Safe |请参阅POSIX安全概念。

     

如果x是信令NaN(sNaN),则此宏返回非零值。它基于TS 18661草案,目前作为GNU启用   扩展

TS的最终草案提到您可能需要选择使用宏来获取它:

#define __STDC_WANT_IEC_60559_BFP_EXT__
#include <math.h> 
int issignaling(real-floating x);

答案 1 :(得分:2)

浮点实数的格式取决于处理器。在x86 / x86-64 ISA上,有效位的高位= 1表示安静,0表示信令。 (其余的NaN有效载荷仍然是任意的。

  • float类型:

    enter image description here

  • double类型:

    enter image description here

  • long double类型(Microsoft编译器不支持):

    enter image description here