gcc的__float128浮点数是否考虑了当前的舍入模式?

Wal*_*has 9 c++ floating-point gcc c++11

对gcc __float128浮点数的算术运算是否考虑了当前的舍入模式?

例如,如果使用C++ 11函数std::fesetenv,我将舍入模式更改为FE_DOWNWARD,将算术运算的结果__float128向下舍入?

这是否符合__float128规范?

oo_*_*uel 2

我相信可以保证操作考虑__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);
Run Code Online (Sandbox Code Playgroud)

输出:

0.3333333333333333333333333333333333
0.3333333333333333333333333333333334
Run Code Online (Sandbox Code Playgroud)