从整数转换为 IEEE 754 浮点数时舍入如何工作?

jho*_*ack 1 c floating-point precision rounding ieee-754

有许多值可以精确表示为 64 位,long但不能表示为 64 位double。(一个简单的例子:2 62 -1。)在给定间距的情况下,舍入是远离零、向零还是到最接近的可能值?

R..*_*R.. 6

符合 IEC 60559 (IEEE 754) 的浮点语义在标准的 Annex F 中定义,在技术上是可选的,但如果没有它,C 的浮点将被指定得太少,以至于毫无意义。假设附录 F 规定(F.3 ¶1):

从整数到浮点类型的转换提供了从整数到浮点的 IEC 60559 转换。

根据当前活动的舍入模式进行舍入。舍入模式可以由fesetroundfrom设置fenv.h,但许多编译器不正确支持 fenv 功能并错误地允许跨模式更改重新排序操作,因此在实践中您应该将其保留为默认值(最近/对偶)。

在没有附件 F 的情况下,从整数转换是 C 指定的少数浮点运算之一(6.3.1.4 ¶2):

如果要转换的值在可以表示但不能精确表示的值范围内,则结果是最接近的较高或最接近的较低可表示值,以实现定义的方式选择。

附件 F 将实现定义的选择限制为与 IEC 60559 一致。几乎所有现实世界的 C 实现都针对附件 F,即使它们不 100% 符合它。因此,我自己的回答以及本网站上许多用户的回答,通常假设有关 C 和浮点数的问题将附件 F 视为基线。