49

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

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

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

4 回答 4

43

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

在 C99 中,您将拥有NANINFINITY宏。

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

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

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

于 2011-06-04T09:19:48.313 回答
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

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


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

于 2011-06-04T09:19:47.790 回答
2

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

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

参考资料:http ://en.cppreference.com/w/c/numeric/math/HUGE_VAL

于 2018-04-16T14:15:58.333 回答
1

有一种实际的方法可以创建无穷大和负无穷大。根据 C89 遵循的 IEEE 754 标准,无穷大被定义为一个浮点数,其尾数(前 23 位)全为零,指数(后 8 位)全为 1。 nan定义为指数中全为 1 且尾数中除全零以外的任何数字(因为那是无穷大)。困难的部分是生成这个数字,但这可以通过以下代码完成:

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;

但是,简单地将 a 转换unsigned为 afloat会导致编译器创建float相同值的 a。所以,我们要做的就是强制编译器将内存读取为浮点数,这给了我们想要的结果。

于 2019-07-18T20:56:15.677 回答