prev up next   top/contents search

comp.lang.c FAQ 列表· 第 14.9 题

如何将变量设置为 IEEE NaN(“非数字”)或其他特殊值,或如何测试这些值?


许多具有高质量 IEEE 浮点实现的系统都提供了(例如预定义的常量和诸如isnan()之类的函数,这些函数作为非标准扩展在<math.h>或可能在<ieee.h><nan.h>)中),以便能够干净利落地处理这些值,并且正在努力正式标准化这些设施。一个简单但通常有效的 NaN 测试可以基于这样的事实:IEEE NaN 永不与其自身或其他任何值相等;因此,一个不与其自身相等的数字必定是 NaN。

	#define isnan(x) ((x) != (x))
不过要注意,不熟悉 IEEE 的编译器可能会优化掉这个测试。(另请注意,即使您有一个预定义的常量,例如NAN,您也不能在诸如if(x == NAN)之类的比较中使用它,同样因为 NaN 不会与其自身相等。)

C99 提供了isnan(), fpclassify()以及其他几个分类例程。

另一种可能性是使用sprintf格式化待处理的值:在许多系统中,它会生成诸如"NaN""Inf"之类的字符串,您可以在紧急情况下进行比较。

要用这些值初始化变量(如果您的系统未提供更简洁的解决方案),您可能可以通过一些编译时“算术”来完成。

	double nan = 0./0.;
	double inf = 1./0.;
不过,如果这些方法不起作用(或者编译器因浮点异常而中止),也不必过于惊讶。

(设置这些特殊值最可靠的方法是使用其内部位模式的十六进制表示,但使用位模式初始化浮点值需要使用联合体或其他类型双关机制,并且显然会依赖于机器。)

另请参阅问题 19.39

参考:C9X 第 7.7.3 节


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管