【问题标题】:Do gcc's __float128 floating point numbers take the current rounding mode into account?gcc 的 __float128 浮点数是否考虑了当前的舍入模式?
【发布时间】:2023-03-20 03:22:01
【问题描述】:

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

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

__float128 规范是否保证这一点?

【问题讨论】:

  • 在机器上测试时看到了什么?例如,当您将舍入模式从roundTowardPositive 更改为roundTowardNegative 时,计算(__float128)1.0 / (__float128)3.0 是否会给出不同的结果?
  • 来自source,至少有一些证据表明支持舍入模式。例如,有一些变更日志条目用于使strtod 支持舍入模式。
  • As I recall,gcc 甚至不支持doubles 的非默认舍入模式。

标签: c++ c++11 gcc floating-point


【解决方案1】:

我相信__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-bit (XFmode) 和 128-bit (TFmode) 浮动类型。对其他类型的支持包括算术 运算符:加、减、乘、除;一元算术 运营商;关系运算符;相等运算符; [...]

参考:https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html

工作示例

Example code and output

__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

【讨论】:

    猜你喜欢
    • 2018-11-12
    • 2011-10-15
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多