首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C-加两个单精度浮点法线数,不能得到无穷大的结果。

C-加两个单精度浮点法线数,不能得到无穷大的结果。
EN

Stack Overflow用户
提问于 2016-05-25 13:48:25
回答 1查看 335关注 0票数 3

我在玩浮点运算,我遇到了一些需要解释的东西。

当将四舍五入模式设置为“向零”时,即:

代码语言:javascript
复制
fesetround(FE_TOWARDZERO);

加上不同的正规正数,我就永远达不到极限。

然而,从ieee 745可以知道,溢出到无穷大可能是由增加有限的数字。

例如:

代码语言:javascript
复制
#include <fenv.h>
#include <stdio.h>

float hex2float (int hex_num) {
  return *(float*)&hex_num;
}

void main() {
  int a_int = 0x7f7fffff; // Maximum finite single precision number, about 3.4E38
  int b_int = 0x7f7fffff;
  float a = hex2float(a_int);
  float b = hex2float(b_int);
  float res_add;

  fesetround(FE_TOWARDZERO);  // need to include fenv.h for that
  printf("Calculating... %+e + %+e\n",a,b);
  res_add = a + b;
  printf("Res = %+e\n",res_add);
}

但是,如果我将舍入模式改为其他方式,我可能会得到一个+INF作为答案。

有人能解释一下吗?

EN

Stack Overflow用户

回答已采纳

发布于 2016-05-25 14:15:38

对观察到的行为的解释是,IEEE 754-2008浮点标准规定:

7.4溢出 溢出异常应在以下情况下发出信号:并且只有当指数范围无界时,目标格式的最大有限数在数量级上超过了圆周率浮点结果(见4)。默认结果应由舍入方向属性和中间结果的符号确定如下: ..。 ( b) roundTowardZero携带所有溢出到格式的最大有限数,并带有中间结果的符号。

因此,对于这里使用的舍入模式(截断,或向零舍入),溢出情况下的结果是最大的有限数,而不是无穷大。

票数 6
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37439180

复制
相关文章

相似问题

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