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

the*_*epi 4 c c++ assembly gcc 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);
Run Code Online (Sandbox Code Playgroud)

Pot*_*ter 8

GNU 提供最近 标准化的设施:

宏: 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);
Run Code Online (Sandbox Code Playgroud)


ahm*_*md0 5

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

  • float 类型:

    在此处输入图片说明

  • double 类型:

    在此处输入图片说明

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

    在此处输入图片说明