如何在ANSI C中生成NaN,-Infinity和+ Infinity?

Ami*_*yan 45 c nan infinity

我使用ANSI C89(不是C++),我想生成NaN,-Infinity和+ Infinity.

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

float f = 0.0 / 0.0; // Is f ALWAYS in any platform is NaN?
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 41

有C99,但以前的标准AFAIK没有.

在C99中,你将拥有NANINFINITY宏.

来自"数学<math.h>"(§7.12)部分

INFINITY扩展为float类型的常量表达式,表示正或无符号(如果可用); ...

如果你坚持使用ANSI C89,那你就不走运了.见C-FAQ 14.9.

  • 你应该说"ANSI C89".当前的"ANSI C"是C99. (20认同)
  • 在 C89 中,宏“HUGE_VAL”可用于定义无穷大值。 (2认同)

jco*_*ctx 5

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

jcomeau@intrepid:/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
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我无法使用这种幼稚的方法获得正 NaN。


另请参阅:http : //www.gnu.org/s/hello/manual/libc/Infinity-and-NaN.html

  • 有趣的是,用clang产生`inf -inf nan`(不是`-nan`)。不太确定`-nan`应该是什么意思,实际上:-) (3认同)