大规模数学运算中有时会碰到结果为NaN的情况,由于NaN参与任何比较得到false(这点与inf不同!),将破坏正常的程序逻辑,又因为NaN同任何数做数学运算得到NaN,具有传递性,使得定位非常困难。
NaN产生的最可能的原因是 0*inf ,大多数路径是这样的:
1/subnormal = inf 或 1/0 = inf --> 0 * inf = nan
下面的代码重现了这一过程:
#include <stdio.h>
#include <math.h>
#include <float.h>
int main()
{
float f = FLT_MIN;
float r = 1.0/f;
printf("Normal: f = %e, r = 1/f = %e\n", f, r);
int subf_i = 0x3;
f = *(float *)&subf_i;
r = 1.0/f;
float mul = r * f;
printf("Subnormal: f = %e, r = 1/f = %e, f*r = %e, 0*r = %e\n", f, r, mul, 0.0*r);
return 0;
}
C99提供的 fpclassify() 宏能够判断浮点数的类型,一种典型的应用方法如下:
for ( i