我想通过逻辑考虑尝试公开 NaN。
如果float 不是无限的(既不大于FLT_MAX 也不小于-FLT_MAX),因此它应该小于或等于FLT_MAX。如果不是,则为 NaN。
int is_inf(float x) { return x < -FLT_MAX || x > FLT_MAX; }
int is_nan(float x) { return !is_inf(x) && !(x <= FLT_MAX); }
我的第一个答案已经被否决了。所以我决定添加一个例子。嗯,它按预期工作。
#include <stdio.h>
#include <math.h>
#include <float.h>
static int is_inf(float x) { return x < -FLT_MAX || x > FLT_MAX; }
static int is_nan(float x) { return !is_inf(x) && !(x <= FLT_MAX); }
static void show(float f)
{
float g = -f;
printf("% f : %i %i %i %i\n", f, isinf(f), isnan(f), is_inf(f), is_nan(f));
printf("% f : %i %i %i %i\n", g, isinf(g), isnan(g), is_inf(g), is_nan(g));
}
int main(void)
{
float inf = FLT_MAX * 2.0f;
float nan = inf / inf;
show(inf);
show(nan);
show(FLT_MAX);
show(FLT_MIN);
show(0.0f);
show(1234.5678f);
return 0;
}
Linux下编译启动:
$ gcc infnan.c
$ ./a.out
inf : 1 0 1 0
-inf : -1 0 1 0
-nan : 0 1 0 1
nan : 0 1 0 1
340282346638528859811704183484516925440.000000 : 0 0 0 0
-340282346638528859811704183484516925440.000000 : 0 0 0 0
0.000000 : 0 0 0 0
-0.000000 : 0 0 0 0
0.000000 : 0 0 0 0
-0.000000 : 0 0 0 0
1234.567749 : 0 0 0 0
-1234.567749 : 0 0 0 0
数据类型double的补充解决方案,改进了返回值。
static int is_inf(double x) {
if (x > DBL_MAX) return 1;
if (x < -DBL_MAX) return -1;
return 0;
}
static int is_nan(double x) { return !is_inf(x) && !(x <= DBL_MAX); }
再想一想,is_nan 可以更容易计算。
int is_nan(double x) { return !(x > DBL_MAX || x <= DBL_MAX); }
甚至没有包含常量。
int is_nan(double x) { return !(x > 0.0 || x <= 0.0); }