将无穷大指定为浮动

时间:2016-01-26 19:20:42

标签: c floating-point

我正在尝试将浮点数初始化为无穷大值,而不使用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被认为是无穷大。

3 个答案:

答案 0 :(得分:1)

问题的原因是符号:

  • 0x7f800000
  • 0b01111111100000000000000000000000

此注释与int类型相关,当您将int分配给float时,从implicit conversionint意味着float。在这种情况下,您的两个数字都是十进制的2139095040,它将被加到float类型。

要避免此问题,您可以在4个字节的精确位位置分配值。这里有几个例子。

float f;
*(int*)&f = 0x7f800000;

或者你可以使用工会

union u_fi {
    float f;
    int   i;
} fi;
fi.i = 0x7f800000;

但是使用这2个解决方案时要小心。如果int在第一种情况下超过4个字节,并且在intbig-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;

根据您的系统/编译器,您可能需要指定标志(例如c99c11将起作用),以便将x显式转换为float并且不存储作为更高的中间精度。