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

时间:2011-06-04 09:12:01

标签: c nan infinity

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

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

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

4 个答案:

答案 0 :(得分:40)

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

在C99中,您将拥有NANINFINITY个宏。

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

  

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

如果你坚持使用ANSI C89,那你就不走运了。请参阅C-FAQ 14.9

答案 1 :(得分:4)

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

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

奇怪的是,我无法使用这种天真的方法获得正面的NaN。

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

答案 2 :(得分:0)

如果您使用不存在INFINITY的旧编译器,您也可以使用宏HUGE_VAL代替,也在<math.h>库中定义。

HUGE_VAL应该在C89 / C90标准(ISO / IEC 9899:1990)中提供。

参考文献:http://en.cppreference.com/w/c/numeric/math/HUGE_VAL

答案 3 :(得分:0)

有一种创建无限和负无限的实际方法。基于C89遵循的IEEE 754标准,无穷大被定义为浮点数,其尾数全为0(前23位),指数全为1(后8位)。 nan定义为指数中全为1的任何数字,尾数中全为0的任何数字(因为这是无穷大)。 “困难”部分正在生成此数字,但这可以通过以下代码完成:

unsigned int p = 0x7F800000; // 0xFF << 23
unsigned int n = 0xFF800000; // 0xFF8 << 20
unsigned int pnan = 0x7F800001; // or anything above this up to 0x7FFFFFFF
unsigned int nnan = 0xFF800001; // or anything above this up to 0xFFFFFFFF

float positiveInfinity = *(float *)&p;
float negativeInfinity = *(float *)&n;
float positiveNaN = *(float *)&pnan;
float negativeNaN = *(float *)&nnan;

诀窍是,仅将无符号的类型转换为浮点数将导致编译器创建相同值的浮点数。因此,我们要做的就是强制编译器以浮点数的形式读取内存,这将为我们带来预期的结果。