浮点数的 “floor division” (例如在python中)是否会导致精度不准?

Can “floor division” of floating-point numbers (e.g. in Python) cause innaccuracy?

guido van rossum写了一篇博客,解释了为什么在python中整数除法(例如,a // b是"底除法")——商被四舍五入为负无穷大。相应地,a % b的符号与b的符号相匹配。

这与c不同,其中商被四舍五入为零,并且a % b的结果有a的符号。

python还使用了floor除法,对于浮点数,相应的"modulo的符号与除数的符号匹配"。博客文章声称这在某些情况下是不准确的(其中C的"模符号与股息符号匹配"是准确的)。这是真的吗?有什么具体的例子吗?


介绍

下面的证据比我想要的要长,但是这个问题已经过了几天没有得到回答,它应该得到一个答案。好的。

在讨论证据之前,让我直观地解决这个问题。如果我们定义modulo来返回x%y的结果,它在[?y/2,+y/2](对于正y),则结果始终是x或通过添加(正或负)y的倍数来减小。如果结果是x,则由于x是以可表示形式给出的,因此它是可表示的。如果结果减小,则它必然是y中低位数字的位置值的倍数,其最大数字位置不大于y中的最大数字位置,因此它适合于浮点格式并可表示。好的。

另一方面,如果我们定义模来返回x%y在[0,y]中的一个结果,那么一个小的负x必须通过加y来增加。当x很小时,它的位数可能比y的位数低,当它这样做时,加y的结果必须在x的最低位置有一个非零位数,但它也必须有一个非零位数。在比小x高的位置(因为y是在更高的位置加一个数字)。因此,结果需要比浮点格式更大的数字,并且结果不可表示。好的。

一个简单的例子是?2?60% 1。数学结果是1?2?60,但是这个不能用有效位中的53位来表示;它需要位置值从2开始的位。1到2?60,需要60位。好的。对称模是精确的

首先,让我们看看对称模的定义,x%y在[?Y/2,+Y/2]对于正Y,总是有一个可表示的结果。我也假设x是正的,但是负x和/或负y的参数是对称的,x=0的结果是微不足道的。好的。

x%y被定义为r,这样r=x?Q?对于某些整数q,通常我们在r或q上定义一些约束,以便r是唯一确定的(或者,当结果处于某个区间的端点时,至少通常是唯一确定的,具有一定的灵活性)。因为q是一个整数,如果x和y都是某个数字g的整数倍(可能是整数,也可能不是整数),那么r也是g的整数倍。好的。

在浮点格式中,使用符号、基数B(大于1的整数)、基数B位数的固定数字P和指数E表示数字。表示的数字是±数字×b e。让我们把各个数字写成dp?1</Sub>d

p?2</Sub>d

p?3..d2d1d0。好的。

考虑输入x和y。使用xi来表示表示表示x时使用的base-b数字,而ex表示x时使用的指数,同样地,对于y,我们有x=xp?1..x0×bexand y=yp?1..y0×bey。好的。

注意x和y都是bex和bey中较小者的倍数,因此r也必须是。好的。

如果是y≤bex,那么r是bey的倍数。而且,r必然小于y。这意味着我们可以将r表示为±rp?1..r0×bey-r足够小,这些带指数ey的数字足够大以表示其值,并且,因为它是bey的倍数,所以它不需要任何带较小指数的数字。因此,R可以用浮点格式表示。好的。(P)Now consider bexbe sub>y。还假设Y是标准化的,我们指的是它的领先地位,和p?1./Sub,is not Zero.(If it is Zero,find a normalized representation of y by decreasing its product to shift a non-Zero digit into the leading position).23 Then the above paragraph applies.If and has no-Zero digits,it is Zero,and x%and is not defined.)They xxand±124;p?10bex好的,好的。Asymmetric modulo may be wrong(P)The above proof tells us that symmetric modulo is exact because the result is always either the unchanged X or x reduced in magnitude sufficiently that all the required digits fit in the floating-point format.and this tells us how to break modulo defined such that x%and is in[0,y]:select an x that must be increased in magnitude.好的,好的。(P)我们有,而且有,还有10be。Let and be normalized,as described above.For x,select any value that is negative,has exeyand is not a multiple of bey(meaning that at least one of its digits from xeyxto x0is not Zero>。在一些案件中,当Y是第一位,而Y是一位被淘汰的人时,结果可能是可以代表的。Otherwise,the greatest digit position it needs is the same as y's greatest digit position,and it need digit s below beyand therefore it is not representative.好的,好的。好吧。