【问题标题】:Does C standard's FE_TONEAREST rounding mode guarantee that halfway ties are rounded to even?C 标准的 FE_TONEAREST 舍入模式是否保证中间关系舍入为偶数?
【发布时间】: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


【解决方案1】:

C11 附件 F 在 §F.1 中说:

IEC 60559 浮点标准专门用于微处理器系统的二进制浮点运算,第二版 (IEC 60559:1989) [...]

然后在 §F.3 第 1 段(正如您在问题中已经引用的那样):

中的 fegetround 和 fesetround 函数提供了在由 中的舍入方向宏(FE_TONEAREST、FE_UPWARD、FE_DOWNWARD、FE_TOWARDZERO)和值表示的 IEC 60559 定向舍入模式中进行选择的便利FLT_ROUNDS 的 0、1、2 和 3 是 IEC 60559 有向舍入模式。

(注意:确切地说,我正在查看 C11 标准的公开 N1570 最终草案,但我的理解是它与最终标准基本相同。)

因此,此处对 IEC 60559 的引用实际上是对(现已两次被取代的)IEC 60559:1989 标准的引用。我无法访问那个精确的标准,但我确实有一份 IEEE 754-1985 的副本,并且我相信这两个标准的内容(IEC 60559:1989 和 IEEE 754-1985 ) 应该是基本相同的,尽管我观察到在各个标准的目录中至少存在大小写差异。 (感谢Michael Burr 在评论中确认标准在实质上是相同的,如果不是逐字相同的话。)

IEEE 754-1985 在第 4 节中定义了四种舍入模式,称为“舍入到最近”、“向 +∞ 舍入”、“向 -∞ 舍入”和“向零舍入”。后三个被描述为“定向舍入模式”。对于“四舍五入”,我们在 §4.1 中有以下文字:

如果两个最接近的可表示值同样接近,则应传递其最低有效位为零的那个

换句话说,它是在描述圆圆的平局。 (IEEE 754 标准的后期版本为上述舍入模式引入了名称“roundTiesToEven”、“roundTowardPositive”、“roundTowardNegative”和“roundTowardZero”(现在称为“属性”而不是“模式”,我相信因为“模式”暗示某种持久的环境设置),并定义第五个舍入属性“roundTiesToAway”。但 C11 明确表示它指的是该标准的早期版本。)

现在由于 C11 没有使用与 IEEE 754-1985 完全相同的术语,因此我们可以推断出上述四种舍入模式分别对应于“FE_TONEAREST”、“FE_UPWARD”、“FE_DOWNWARD”和“FE_TOWARDZERO”,按照这个顺序,但似乎没有任何理由怀疑这是预期的匹配。所以假设__STDC_IEC_559__ 被定义,FE_TONEAREST 应该确实对应于“roundTiesToEven”。 Nate Eldredge 对 C2x 的评论进一步强化了这是预期的匹配。

总而言之,很明显(至少对我而言)意图是当定义__STDC_IEC_559__时,舍入模式FE_TONEAREST应该对应于“四舍五入到最近”,在更高版本的 IEEE 754 标准中命名为“roundTiesToEven”。当然,C 的实现在多大程度上尊重这种意图是一个单独的问题(但我希望他们中的绝大多数都这样做)。

【讨论】:

  • FWIW,正如您所料,您在 IEEE 754-1985 中给出的描述与 IEC 60559-1989 第 4 节中的描述完全相同。请注意,IEEE754-1985 和 IEC 60559-1989 并非逐字相同,但我检测到的唯一差异是完全无关紧要的(例如,“Section”与“Clause”)。哦,IEC 60559-1989 包含法语和英语文本(左侧页面是法语,右侧是英语,这使得在 PDF 阅读器中阅读有点烦人)。
  • @MichaelBurr:非常感谢。我已经相应地更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多