2011-06-04 53 views
41

我使用ANSI C89(不是C++),我想生成NaN,-Infinity和+ Infinity。如何在ANSI C中生成NaN,-Infinity和+ Infinity?

是否有任何标准的方式(如标准宏)? 或者是否有任何平台和编译器独立的方式来生成这些数字?

float f = 0.0/0.0; // Is f ALWAYS in any platform is NaN? 
+1

该标准甚至不需要任何平台来支持NaN和无穷大。尽管如此,我认为需要符合IEEE 754标准来支持通过部门来获得它们。 – 2011-06-04 12:23:31

回答

34

有在C99,但不是在以前的标准AFAIK。

在C99中,您将拥有NANINFINITY宏。

“数学<math.h>(§7.12)部分

INFINITY扩展到浮点型表示的常量表达式的正或无符号的在无穷大,如果有的话; ...

如果你坚持使用ANSI C89,那么你的运气不好。请参阅C-FAQ 14.9

+0

谢谢,但我必须使用ANSI C. – 2011-06-04 09:28:55

+19

你应该说“ANSI C89”。目前的“ANSI C”是C99。 – 2011-06-04 12:24:23

4

我不知道这是标准的或便携式的,但这里是一个开始:

[email protected]:/tmp$ cat test.c; make test; ./test 
#include <stdio.h> 
int main() { 
printf("%f\n", 1.0/0); 
printf("%f\n", -1.0/0); 
printf("%f\n", 0.0/0); 
return 0; 
} 
cc  test.c -o test 
test.c: In function ‘main’: 
test.c:3: warning: division by zero 
test.c:4: warning: division by zero 
test.c:5: warning: division by zero 
inf 
-inf 
-nan 

奇怪的是,用这种幼稚的做法我不能让正为NaN。


也看到这一点: http://www.gnu.org/s/hello/manual/libc/Infinity-and-NaN.html

+2

有趣,这会产生带有铛的'inf -inf nan'(不是'-nan')。真的不知道“-nan”应该是什么意思,实际上:-) – Mat 2011-06-04 09:23:06

+0

VS2010的结果: 1.#INF00 -1。#INF00 -1。#IND00 – 2011-06-04 09:37:18

+3

微软的C库非常不合格。 – 2011-06-04 12:24:03