使用截断朝向负无穷大而不是零的优点

rla*_*la4 4 compiler-construction haskell truncate

我想知道从编程语言/编译器实现的角度来看,使用截断到负无穷大(Haskell,Ruby)而不是截断到零(C,PHP)的好处是什么.

看起来向负无穷大的截断是正确的方法,但我没有找到这种声明的可靠来源,也没有找到这样的决定如何影响编译器的实现.我对可能的编译器优化特别感兴趣,但不是唯一的.

相关来源:

哈斯克尔分部

quotRem和divMod之间的区别何时有用?

Jak*_*hur 9

这些实际上甚至不是唯一的选择,事实上,通常甚至可能不是最好的选择.我可以在这里总结一下,但最好只链接到这篇与truncate,floor和Euclidean部门形成对比的优秀论文,涵盖理论和一些现实世界的应用,函数的欧几里德定义div和mod,Raymond T. Boute.


fal*_*lse 5

这里引用了 ISO/IEC 10967-1:2012语言无关算术(vl. LIA-1) C.5.1.2.2附录 C 中的(信息性)基本原理。省略号...由我插入。

... 两种舍入规则是常用的:向负无穷大quot I)舍入,向零舍入。后者在 LIA-1 中没有指定,因为当参数具有不同的符号时容易错误使用。例如,

quot I (-3,2) = -2 向负无穷大舍入,在 LIA-1 中指定

div t I (-3,2) = -1 向零舍入,不再由 LIA 的任何部分指定

quot I ...以及...都满足一个广泛有用的翻译不变量:

   quot I ( x + i * y , y) = quot I ( x , y ) + i    如果y ? 0,不发生溢出

... quot I是许多数学家首选的整数除法形式。div t I(LIA 不再指定)是 Fortran 引入的除法形式。

整数除法经常用于分组。例如,如果要将一系列索引项划分为n 个项目的组,则将 itemi放入 group是很自然的i/n。如果quot I用于整数除法,这会很好用。但是,如果使用div t I(不再在 LIA 中指定)并且i可以为负数,则组 0 将获得 2 ?n -1 项而不是所需的n。否定的这种不均匀行为i会导致微妙的程序错误,并且是反对使用div t I ...

  • 我想不出任何时候我发现向零取整或相关的余数函数有用。此外,我能想到 a==(a/b)*b + a%b 保证有用的唯一代码是试图解决除法使用向零舍入这一事实的代码。另一个向负无穷取舍取胜的地方,顺便说一句:计算三个数字的舍入平均值之类的东西。如果平均值为正,或者使用舍入到负无穷大除法,则表达式 `(a+b+c+1)/3` 可以很好地工作。如何用舍入到零来做等价的? (3认同)