我在玩浮点运算,我遇到了一些需要解释的东西。
当将四舍五入模式设置为“向零”时,即:
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作为答案。
有人能解释一下吗?
发布于 2016-05-25 14:15:38
对观察到的行为的解释是,IEEE 754-2008浮点标准规定:
7.4溢出 溢出异常应在以下情况下发出信号:并且只有当指数范围无界时,目标格式的最大有限数在数量级上超过了圆周率浮点结果(见4)。默认结果应由舍入方向属性和中间结果的符号确定如下: ..。 ( b) roundTowardZero携带所有溢出到格式的最大有限数,并带有中间结果的符号。
因此,对于这里使用的舍入模式(截断,或向零舍入),溢出情况下的结果是最大的有限数,而不是无穷大。
https://stackoverflow.com/questions/37439180
复制相似问题