首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从实浮点数到整数的转换是否要求将值截断为零,以便于代码从Fortran移植到C?

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

Stack Overflow用户
提问于 2021-09-02 17:37:22
回答 2查看 121关注 0票数 0

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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-02 18:10:24

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

K&R第一版在第42页说,“…”float to int会导致任何小数部分的截断,“并且,在第184页”…。浮点数转换为整数类型的转换往往与机器有关;特别是,负数截断的方向因机器而异,…“。

所以你就有了。K&R为“截断”提供了向零或实际上向−∞的“截断”。C委员会发现没有人做后者,所以他们采用了前者。如果你想知道更多,你将不得不问布赖恩克尼汉或在他们的作品中寻找它。

票数 2
EN

Stack Overflow用户

发布于 2021-09-02 18:03:51

最简单的通常是最好的

在20世纪70年代,除了今天之外,还有许多舍入模式和各种好处。C根据现有做法寻求妥协。由于四舍五入的模式在当时的行业中并不那么统一(IMO,它们仍然不是),最简单的,截断,是规范的。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69034886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档