【发布时间】:2021-11-20 17:11:35
【问题描述】:
我正在编写的代码依赖于 C(特别是 c11)中的中途关系四舍五入到偶数。当将带有舍入模式的 rint 用作 FE_TONEAREST 时,我没有在 C 标准中找到说明如何使用 FE_NEAREST 处理关系的保证。 ISO C standard 的第 509 页指出
中的 fegetround 和 fesetround 函数提供了便利 在由舍入表示的 IEC 60559 定向舍入模式中进行选择 中的方向宏 (FE_TONEAREST, FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO) 和 FLT_ROUNDS 的值 0、1、2 和 3 是 IEC 60559 定向舍入模式。
但是,我在 IEC 60559 标准中找不到任何有关舍入模式的文档。在我的测试机器上,行为是在 FE_TONEAREST 中,平局被舍入为偶数,我想确保这是由 c11 标准强制执行的,而不是实现定义的。
【问题讨论】:
-
您能否澄清您的评论“我找不到任何文档...用于舍入模式”?您应该在 ISO/IEC 60559:2020 的第 4.3 节中找到它,标题为“Rounding-direction attributes”。注意:这里的术语似乎确实存在不幸的不匹配:在 IEC 60559 中,“定向舍入”不包括舍入到最近舍入方向属性。
-
AFAIK 未在 C17 中指定,但将在 C2x 中。 N2696 F.3p9:“宏 (7.6) ...FE_TONEAREST 代表 IEC 60559 舍入方向属性 ...roundTiesToEven”
-
我想重要的是要注意 C11 指定它指的是 IEC 60559:1989,并且在该版本的标准中(与更高版本不同),仅描述了 4 种舍入模式 - 三种定向模式, 和圆领带。 (对于那个更旧版本的标准,四舍五入的细节在第 4.1 和 4.2 节中。)
-
哪些关系不是中途关系?
-
@EricPostpischil 中途关系来自DRD。
标签: c language-lawyer rounding c11 fenv