我使用ANSI C89(不是C ++),我想生成NaN,-Infinity和+ Infinity。
有没有标准方式(例如标准宏)? 或者是否有任何平台和编译器独立的方式来生成这些数字?
float f = 0.0 / 0.0; // Is f ALWAYS in any platform is NaN?
答案 0 :(得分:40)
有C99,但以前的标准AFAIK没有。
在C99中,您将拥有NAN
和INFINITY
个宏。
来自“数学<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)中提供。
答案 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;
诀窍是,仅将无符号的类型转换为浮点数将导致编译器创建相同值的浮点数。因此,我们要做的就是强制编译器以浮点数的形式读取内存,这将为我们带来预期的结果。