这种使用位移操作的除法近似如何工作?

时间:2015-10-11 09:55:15

标签: java math bit-manipulation bit-shift

onResume中,出现以下代码行:

java.util.DualPivotQuicksort

变量// Inexpensive approximation of length / 7 int seventh = (length >> 3) + (length >> 6) + 1; 是大于或等于47的length

我熟悉签名的右移操作符的工作原理。但是我不知道为什么这些特定的操作会导致除法的近似值。有人可以解释一下吗?

4 个答案:

答案 0 :(得分:8)

>>是bitshift。你向右移动的每一位,实际上除以2的数字。

因此,(length >> 3)length/8(向下舍入),(length >> 6)length/64

(length/8)+(length/64)约为length*(1/8+1/64) = length*0.140625(约)

1/7 = 0.142857...

每个字词的最后+1可以拆分为+0.5,以便length/8四舍五入到最近(而不是向下),length/64也是四舍五入到最近。

通常,您可以轻松地使用1/y近似y = 2^n+-1,其中1 + x + x^2 + x^3 + ... = 1 / (1 - x) 采用类似的位移近似。

无限几何系列是:

x + x^2 + x^3 + ... = x/(1 - x)

乘以x:

x = 1/2^n

代替1/2^n + 1/2^2n + 1/2^3n + ... = (1/2^n) / (1 - 1/2^n) 1/2^n + 1/2^2n + 1/2^3n + ... = (1/2^n) / ((2^n - 1)/2^n) 1/2^n + 1/2^2n + 1/2^3n + ... = 1 / (2^n - 1)

y = 2^n - 1

这近似y = 2^n + 1

要近似x = -1/2^n,请替换- 1/2^n + 1/2^2n - 1/2^3n + ... = (-1/2^n) / (1 + 1/2^n) 1/2^n - 1/2^2n + 1/2^3n - ... = (1/2^n) / ((2^n + 1)/2^n) 1/2^n - 1/2^2n + 1/2^3n - ... = 1 / (2^n + 1)

AX

然后将无限系列截断到所需的精度。

答案 1 :(得分:3)

在众所周知的平等

中设置x = 1/8
1 + x + x^2 + x^3 + ... = 1 / (1 - x)

并简化,给予

1/8 + 1/64 + 1/512 + ...  = 1/7

在示例中将length的两边相乘,以提供

length / 7 = length / 8 + length / 64 + length / 512 + ...

请注意,这是“精确”除法,而不是整数除法 - 我正在编写数学,而不是Java代码。

然后,近似假设第三个和后续术语太小而不重要,并且平均length / 8length / 64中的一个可能需要四舍五入,而不是向下舍入。所以,现在使用整数除法,length / 7 = length / 8 + length / 64 + 1是一个非常好的近似值。

您使用按位运算符提供的表达式只是另一种编写此表达式的方法,前提是length为正。

答案 2 :(得分:2)

将数学背景放在ronalchn的答案中:

由于7 = 8-1 = 8 *(1-1 / 8),按几何级数除以7与乘法相同

  

1/7 = 1/8·(1 + 1/8 + 1 /8²+ 1 /8³+ ...)= 1/8 + 1 /8²+ 1 /8³+ ......

为了对除法进行相同的处理,可以使用3·5 = 16-1,因此

  

1/5 = 3/16·(1 + 1/16 + 1 /16²+ ...)

会邀请像

这样的公式
(3*n)<<4 + (3*n) << 8 + 1

答案 3 :(得分:1)

计算

的所有值
n/8 + n/64 - n/7

错误线性增长,同时保持负面。

下面的列表显示了第一次出现给定错误

n = 7 e = -1
n = 63 e = -2
n = 511 e = -3
n = 959 e = -4
n = 1407 e = -5
n = 1855 e = -6
n = 2303 e = -7
n = 2751 e = -8
n = 3199 e = -9
n = 3647 e = -10
n = 4095 e = -11
n = 4543 e = -12
n = 4991 e = -13
n = 5439 e = -14
n = 5887 e = -15
n = 6335 e = -16
n = 6783 e = -17
n = 7231 e = -18
n = 7679 e = -19
n = 8127 e = -20
n = 8575 e = -21
n = 9023 e = -22
n = 9471 e = -23
n = 9919 e = -24
...

该比率明显趋于1/448 = 1/8 + 1/64 - 1/7