gpt4 book ai didi

c - 将无穷大赋给 float

转载 作者:行者123 更新时间:2023-11-30 15:12:33 24 4
gpt4 key购买 nike

我正在尝试将 float 初始化为无穷大,并且不使用 INFINITY 宏。

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),而其他数据直到最后一个数据才改变?

0x7f7fffff 应该是 float 可以达到的最大值,并尝试 here 0x7f80000 被视为无穷大。

最佳答案

问题的原因是符号:

  • 0x7f800000
  • 0b01111111100000000000000000000000

此符号与 int 相关键入并在分配 int 时至float这意味着implicit conversion来自intfloat 。在这种情况下,您的两个号码都是 2139095040以十进制表示,它将被转换为 float类型。

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

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

或者你可以使用 union

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

但是使用这两种解决方案时要小心。当 int 时它不会安全工作在第一种情况下超过 4 个字节,当 int 时根本不起作用是 big-endian 。因此,该解决方案依赖于平台,我建议使用如下所示的宏。

解决您问题的另一个方法是使用非常大的数字,将其转换为 floatinf 。为此,您可以使用宏,如 <math.h> 中所示。

#define _HUGE_ENUF  1e+300
#define INFINITY ((float)(_HUGE_ENUF * _HUGE_ENUF))
float f = INFINITY;

关于c - 将无穷大赋给 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35022082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com