C11,6.3.1.4实际浮点数和整数:
当实浮点类型的有限值转换为_Bool以外的整数类型时,小数部分被丢弃(即该值被截断为零)。
“值被截断为零”的理由是什么?例如,为什么不“舍入到最近的整数值,中间情况四舍五入为偶数”(IEEE754,convertToIntegerTiesToEven(x))?
“国际标准的基本原理-程序设计语言- C",第5.10修订版,2003年4月至4月:
6.3.1.5实际浮动类型(着重号后加):
由于在前一种情况下,截断-接近于零是C的适当设置,因此要求这样的实现循环浮动是很昂贵的。
6.5.5乘法运算符(着重号后加):
在C89中,涉及负操作数的整数的划分可以以实现定义的方式向上或向下旋转;目的是避免在运行时代码中产生开销,以检查特殊情况并强制执行特定行为。然而,在Fortran中,结果总是被截断为零,并且这种开销似乎是数字编程社区可以接受的。因此,C99现在需要类似的行为,这将促进代码从Fortran移植到C。
发布于 2021-09-02 18:10:24
你的问题在你所引述的那一段之前的一段中得到了回答。6.3.1.4说:“尽管K&R允许负浮动值从零截断,但没有C89委员会成员知道以这种方式工作的实现。”也就是说,每个已知的C实现都将浮点值截断为零,因此这是标准的(因为它确保了将来的一致性)。
K&R第一版在第42页说,“…”float to int会导致任何小数部分的截断,“并且,在第184页”…。浮点数转换为整数类型的转换往往与机器有关;特别是,负数截断的方向因机器而异,…“。
所以你就有了。K&R为“截断”提供了向零或实际上向−∞的“截断”。C委员会发现没有人做后者,所以他们采用了前者。如果你想知道更多,你将不得不问布赖恩克尼汉或在他们的作品中寻找它。
https://stackoverflow.com/questions/69034886
复制相似问题