首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将无穷大赋值为浮动

将无穷大赋值为浮动
EN

Stack Overflow用户
提问于 2016-01-26 19:20:41
回答 3查看 5K关注 0票数 1

我正在尝试初始化一个浮点,使其值无穷大,而不使用无穷大宏。

代码语言:javascript
复制
float f[] = {
            0b01111111100000000000000000000000, // 0x7f800000
            0x7f800000 -1,
            0x7f800000 -2,
            0x7f800000 -64,
            0x7f800000 -65
        };

印刷:

代码语言:javascript
复制
2139095040.000000
2139095040.000000
2139095040.000000
2139095040.000000
2139094912.000000

为什么第一个数据不无穷大(如1 / 0.0)而其他数据直到最后一个数据才会改变?

0x7f7fff应该是浮点数可以达到的最大值,而尝试这里 0x7f80000被认为是无穷大的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-26 20:23:35

你出现问题的原因是符号:

  • 0x7f800000
  • 0b01111111100000000000000000000000

这个符号与int类型相关,当您将int分配给float时,它的意思是从intfloatimplicit conversion。在本例中,您的两个数字都是十进制中的2139095040,它将被合并为float类型。

为了避免这个问题,您可以将值赋值在4字节的确切位位置。这里有几个例子。

代码语言:javascript
复制
float f;
*(int*)&f = 0x7f800000;

或者你可以使用工会

代码语言:javascript
复制
union u_fi {
    float f;
    int   i;
} fi;
fi.i = 0x7f800000;

但是在使用这2种解决方案时要小心。在第一种情况下,当int大于4字节时,它就不能安全工作;当intbig-endian时,它将完全不能工作。因此,这个解决方案与平台有关,我建议使用宏,如下所示。

解决问题的另一个解决方案是将非常多的wich转换成float作为inf。为此,可以使用宏(如<math.h>中的宏)

代码语言:javascript
复制
#define _HUGE_ENUF  1e+300
#define INFINITY   ((float)(_HUGE_ENUF * _HUGE_ENUF))
float f = INFINITY;
票数 2
EN

Stack Overflow用户

发布于 2016-01-26 20:10:32

您可以使用宏HUGE_VAL。或者,如果您愿意,可以将一个虚拟变量初始化为零,然后除以该变量(这样就不会得到编译错误)。

票数 0
EN

Stack Overflow用户

发布于 2016-01-28 09:46:08

假设您使用的是IEEE754 (您的问题暗示了这一点),您可以给出一个溢出的结果。float只能表示到3.4028235f38为止的值,因此我们可以使用

代码语言:javascript
复制
float x = 1e20f*1e20f;

根据系统/编译器的不同,您可能需要指定标志(例如,c99c11可以工作),以便将x显式地传递给float,而不是存储为更高的中间精度。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35022082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档