3

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

将舍入模式设置为“趋向零”时,又名:

fesetround(FE_TOWARDZERO);

并且添加不同类型的正常正数,我永远无法达到无穷大。

然而,从 ieee 745 可知,溢出到无穷大可能是由添加有限数引起的。

例如:

#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 作为答案。

有人可以解释一下吗?

4

1 回答 1

6

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

7.4 溢出

当且仅当目标格式的最大有限数在幅度上超过了四舍五入的浮点结果(见 4)时,才会发出溢出异常信号,而指数范围是无界的。默认结果由rounding-direction属性和中间结果的符号决定,如下所示:

[...]

b) roundTowardZero 携带所有溢出到格式的最大有限数,并带有中间结果的符号。

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

于 2016-05-25T14:15:38.283 回答