我正在尝试初始化一个浮点,使其值无穷大,而不使用无穷大宏。
float f[] = {
0b01111111100000000000000000000000, // 0x7f800000
0x7f800000 -1,
0x7f800000 -2,
0x7f800000 -64,
0x7f800000 -65
};印刷:
2139095040.000000
2139095040.000000
2139095040.000000
2139095040.000000
2139094912.000000为什么第一个数据不无穷大(如1 / 0.0)而其他数据直到最后一个数据才会改变?
0x7f7fff应该是浮点数可以达到的最大值,而尝试这里 0x7f80000被认为是无穷大的。
发布于 2016-01-26 20:23:35
你出现问题的原因是符号:
0x7f8000000b01111111100000000000000000000000这个符号与int类型相关,当您将int分配给float时,它的意思是从int到float的implicit conversion。在本例中,您的两个数字都是十进制中的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时,它将完全不能工作。因此,这个解决方案与平台有关,我建议使用宏,如下所示。
解决问题的另一个解决方案是将非常多的wich转换成float作为inf。为此,可以使用宏(如<math.h>中的宏)
#define _HUGE_ENUF 1e+300
#define INFINITY ((float)(_HUGE_ENUF * _HUGE_ENUF))
float f = INFINITY;发布于 2016-01-26 20:10:32
您可以使用宏HUGE_VAL。或者,如果您愿意,可以将一个虚拟变量初始化为零,然后除以该变量(这样就不会得到编译错误)。
发布于 2016-01-28 09:46:08
假设您使用的是IEEE754 (您的问题暗示了这一点),您可以给出一个溢出的结果。float只能表示到3.4028235f38为止的值,因此我们可以使用
float x = 1e20f*1e20f;根据系统/编译器的不同,您可能需要指定标志(例如,c99或c11可以工作),以便将x显式地传递给float,而不是存储为更高的中间精度。
https://stackoverflow.com/questions/35022082
复制相似问题