从实数浮点数到整数的转换是否需要将值截断为零以方便将代码从 Fortran 移植到 C?

Is conversion from real floating to integer requires that the value is truncated toward zero to facilitate porting of code from Fortran to C?

C11, 6.3.1.4 实数浮点数和整数:

When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero).

“值被截断为零”的理由是什么?例如,为什么不“四舍五入到最接近的整数值,中间情况四舍五入到偶数”(IEEE 754,convertToIntegerTiesToEven(x))?

来自文档“国际标准的基本原理——编程语言——C”,修订版 5.10,2003 年 4 月:

6.3.1.5 真正的浮动类型(添加了重点):

Since truncation-toward-zero is the appropriate setting for C in the former case, it would be expensive to require such implementations to round to float.

6.5.5 乘法运算符(强调已添加):

In C89, division of integers involving negative operands could round upward or downward in an implementation-defined manner; the intent was to avoid incurring overhead in run-time code to 10 check for special cases and enforce specific behavior. In Fortran, however, the result will always truncate toward zero, and the overhead seems to be acceptable to the numeric programming community. Therefore, C99 now requires similar behavior, which should facilitate porting of code from Fortran to C.

The simplest is usually the best one.

在 1970 年代和 today 中有许多舍入模式和各种好处。 C 在现有实践的基础上寻求妥协。由于舍入模式在当时的行业中不是那么统一(IMO,它们仍然不是),最简单的截断是规范

IEEE 754 规范(1980 年代)出现在 C(1970 年代)之后。 IEEE 754 今天提供指导,但在早期的 C 时代并没有被广泛采用。各个厂商都有自己偏爱的方案。

我怀疑 的想法“确保未来的统一性”也是一个关键因素。

你的问题在你引用的前一段中得到了回答。 6.3.1.4 说“尽管 K&R 允许负浮动值从零截断,但没有 C89 委员会成员知道以这种方式运行的实现。” ,每个已知的 C 实现都将浮点值截断为零,因此它成为了标准(因为它确保了未来的统一性)。

K&R 第一版在第 42 页上说,“……floatint 会导致任何小数部分被截断,”并且在第 184 页上“……将浮点值转换为整数类型倾向于相当依赖机器;特别是负数的截断方向因机器而异……”

好了。 K&R 提供向零或有效地向 −∞ 的“截断”。 C 委员会发现没有人做后者,所以他们采用了前者。如果您想了解更多,您将不得不询问 Brian Kernighan 或在他们的著作中寻找它。