0

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

当实浮点类型的有限值转换为_Bool 以外的整数类型时,小数部分被丢弃(即,该值被截断为零)。

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

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

6.3.1.5 真正的浮点类型(强调):

由于在前一种情况下,向零截断是 C 的适当设置,因此要求此类实现舍入以浮动会很昂贵。

6.5.5 乘法运算符(强调):

在 C89 中,涉及负操作数的整数除法可以以实现定义的方式向上或向下舍入;目的是避免在运行时代码中产生开销,以 10 检查特殊情况并强制执行特定行为。然而,在 Fortran 中,结果将始终向零截断,并且开销似乎对于数值编程社区是可以接受的。因此,C99 现在需要类似的行为,这应该有助于将代码从 Fortran 移植到 C

4

2 回答 2

3

最简单的通常是最好的

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

IEEE 754规范(1980 年代)出现在 C(1970 年代)之后。IEEE 754 今天提供了指导,但在早期的 C 时代并没有被广泛采用。不同的制造商都有自己喜欢的解决方案。

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

于 2021-09-02T18:03:51.490 回答
2

Your question is answered in the paragraph before the one you quoted. 6.3.1.4 says “Although K&R permitted negative floating values to truncate away from zero, no C89 Committee member knew of an implementation that functioned in such a manner.” I.e., every known C implementation truncated floating-point values toward zero, so that was made the standard (since it ensures future uniformity).

K&R first edition says, on page 42, “… float to int causes truncation of any fractional part,” and, on page 184 “… Conversions of floating values to integral type tend to be rather machine-dependent; in particular the direction of truncation of negative numbers varies from machine to machine…”</p>

So there you have it. K&R provided for “truncation” either toward zero or, effectively, toward −∞. The C committee found nobody doing the latter, so they adopted the former. If you want to know more, you will have to ask Brian Kernighan or look for it in their writings.

于 2021-09-02T18:10:24.050 回答