我正在尝试将浮点数初始化为无穷大值,而不使用INFINITY宏。
${..}
印刷:
float f[] = {
0b01111111100000000000000000000000, // 0x7f800000
0x7f800000 -1,
0x7f800000 -2,
0x7f800000 -64,
0x7f800000 -65
};
为什么第一个数据无穷大(如2139095040.000000
2139095040.000000
2139095040.000000
2139095040.000000
2139094912.000000
)和其他数据无法在最后一个数据之前发生变化?
0x7f7fffff应该是浮点数的最大值,尝试here 0x7f80000被认为是无穷大。
答案 0 :(得分:1)
问题的原因是符号:
0x7f800000
0b01111111100000000000000000000000
此注释与int
类型相关,当您将int
分配给float
时,从implicit conversion
到int
意味着float
。在这种情况下,您的两个数字都是十进制的2139095040
,它将被加到float
类型。
要避免此问题,您可以在4个字节的精确位位置分配值。这里有几个例子。
float f;
*(int*)&f = 0x7f800000;
或者你可以使用工会
union u_fi {
float f;
int i;
} fi;
fi.i = 0x7f800000;
但是使用这2个解决方案时要小心。如果int
在第一种情况下超过4个字节,并且在int
为big-endian
时根本不起作用,则无法安全运行。所以这个解决方案依赖于平台,我建议使用如下所示的宏。
您的问题的另一个解决方案是使用非常大量的转换为float
作为inf
。为此,您可以在<math.h>
#define _HUGE_ENUF 1e+300
#define INFINITY ((float)(_HUGE_ENUF * _HUGE_ENUF))
float f = INFINITY;
答案 1 :(得分:0)
您可以使用宏HUGE_VAL。或者,如果您愿意,可以将虚拟变量初始化为零,并除以该变量(这样您就不会收到编译错误)。
答案 2 :(得分:0)
假设您正在使用IEEE754(您的问题暗示),您可以提供溢出的结果。 float
只能代表最高3.4028235f38
的值,因此我们可以使用
float x = 1e20f*1e20f;
根据您的系统/编译器,您可能需要指定标志(例如c99
或c11
将起作用),以便将x
显式转换为float
并且不存储作为更高的中间精度。