C 标准的 FE_TONEAREST 舍入模式是否保证中途平局舍入为偶数?

Ben*_*jie 7 c rounding language-lawyer fenv c11

我正在编写依赖于 C(特别是 c11)四舍五入到偶数的中间关系的代码。当使用带有舍入模式的 rint 作为 FE_TONEAREST 时,我没有在 C 标准中找到说明如何使用 FE_NEAREST 处理关系的保证。ISO C 标准第 509 页指出

<fenv.h> 中的 fegetround 和 fesetround 函数提供了在 <fenv.h> 中的舍入方向宏(FE_TONEAREST、FE_UPWARD、FE_DOWNWARD、FE_TOWARDZERO)和值 0、1 表示的 IEC 60559 定向舍入模式之间进行选择的工具FLT_ROUNDS 的 、 、 2 和 3 是 IEC 60559 定向舍入模式。

但是,我在 IEC 60559 标准中找不到有关舍入模式的任何文档。在我的测试机器上,行为是在 FE_TONEAREST 中,关系四舍五入为偶数,我想确保这是由 c11 标准强制执行的,而不是实现定义的。

Mar*_*son 4

C11 附件 F 在 \xc2\xa7F.1 中说:

\n
\n

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

\n
\n

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

\n
\n

<fenv.h> 中的 fegetround 和 fesetround 函数提供了在 <fenv.h> 中的舍入方向宏(FE_TONEAREST、FE_UPWARD、FE_DOWNWARD、FE_TOWARDZERO)和值 0、1 表示的 IEC 60559 定向舍入模式之间进行选择的工具FLT_ROUNDS 的 、2 和 3 是 IEC 60559 定向舍入模式。

\n
\n

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

\n

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

\n

IEEE 754-1985 在第 4 节中定义了四种舍入模式,分别称为“舍入到最近”、“舍入到 +\xe2\x88\x9e”、“舍入到 -\xe2\x88\x9e”和“舍入”走向零”。后三种被描述为“定向舍入模式”。对于“舍入到最接近的”,我们在 \xc2\xa74.1 中有文本:

\n
\n

如果两个最接近的可表示值同样接近,则应交付最低有效位为零的值

\n
\n

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

\n

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

\n

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

\n