Can “floor division” of floating-point numbers (e.g. in Python) cause innaccuracy?
guido van rossum写了一篇博客,解释了为什么在python中整数除法(例如,
这与c不同,其中商被四舍五入为零,并且
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 x