Wal*_*has 9 c++ floating-point gcc c++11
对gcc __float128浮点数的算术运算是否考虑了当前的舍入模式?
例如,如果使用C++ 11函数std::fesetenv,我将舍入模式更改为FE_DOWNWARD,将算术运算的结果__float128向下舍入?
这是否符合__float128规范?
我相信可以保证操作考虑__float128舍入模式。
根据GNU C 库文档,浮点计算遵循舍入模式。
根据GCC手册__float128,它是一个浮点类型,支持除法等算术运算。
由此我推断,对于 的运算,必须考虑__float128舍入模式。
GNU C 库文档指出:
20.6 舍入模式
浮点计算在内部以额外的精度进行,然后四舍五入以适合目标类型。这确保结果与输入数据一样精确。IEEE 754 定义了四种可能的舍入模式:[...]
参考: http: //www.gnu.org/software/libc/manual/html_node/Rounding.html
GCC手册指出:
6.11 附加浮动类型
作为扩展,GNU C 支持额外的浮点类型 __float80 和 __float128,以支持 80 位(XFmode)和 128 位(TFmode)浮点类型。对其他类型的支持包括算术运算符:加、减、乘、除;一元算术运算符;关系运算符;相等运算符;[...]
参考: https: //gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
__float128 f1=1.0;
__float128 f2=3.0;
char buf[256];
fesetround(FE_DOWNWARD);
quadmath_snprintf (buf, sizeof buf, "%*.34Qf",10, (f1/f2));
printf ("%s\n", buf);
fesetround(FE_UPWARD);
quadmath_snprintf (buf, sizeof buf, "%*.34Qf",10, (f1/f2));
printf ("%s\n", buf);
输出:
0.3333333333333333333333333333333333
0.3333333333333333333333333333333334