整数除255快速算法的完全不严谨推导

本文探讨了C语言中一种整数除以255的快速算法,通过展开和误差分析,解释了算法原理。在[0,65536]范围内,该算法通过找补误差实现了快速近似除法,并提供了简化版算法在[0,65534]范围内也能保持有效性的证明。
摘要由CSDN通过智能技术生成

在浏览一个帖子C 语言有什么奇技淫巧?时,无意看到一个整数除255快速算法,其算法如下:

#define div_255_fast(x)    (((x) + (((x) + 257) >> 8)) >> 8)

对此算法已有人给出证明255快除算法的证明和推广,但对于我的数学水平而言,这个证明似乎比这个算法本身更难以理解。在此,仅列出自己的理解过程,且是完全不严谨的。
算法展开式如下:
x 255 = x 2 8 + x 255 ∗ 2 8 = x 2 8 + x 2 16 + x 255 ∗ 2 16 = x 2 8 + x 2 16 + x 2 24 + x 2 32 + x 255 ∗ 2 32 \frac{x}{255}=\frac{x}{2^8}+\frac{x}{255*2^8}=\frac{x}{2^8}+\frac{x}{2^{16}}+\frac{x}{255*2^{16}}=\frac{x}{2^8}+\frac{x}{2^{16}}+\frac{x}{2^{24}}+\frac{x}{2^{32}}+\frac{x}{255*2^{32}} 255x=28x+25528x=28x+216x+255216x=28x+216x+224x+232x+255232x
x 2 24 + x 2 32 + x 255 ∗ 2 32 \frac{x}{2^{24}}+\frac{x}{2^{32}}+\frac{x}{255*2^{32}} 224x+232x+255232x视为 x 255 − ( x 2 8 + x 2 16 ) \frac{x}{255}-(\frac{x}{2^8}+\frac{x}{2^{16}}) 255x(28x+216x)的误差部分,在[0,65536]的范围内,误差部分在x=65536时有最大值,该最大值为 1 2 8 + 1 2 16 + 1 255 ∗ 2 16 \frac{1}{2^{8}}+\frac{1}{2^{16}}+\frac{1}{255*2^{16}} 281+2161+2552161,不妨舍弃 1 255 ∗ 2 16 \frac{1}{255*2^{16}} 2552161取最大值为 1 2 8 + 1 2 16 \frac{1}{2^{8}}+\frac{1}{2^{16}} 281+2161,此时有:
x 255 ≈ x 2 8 + x 2 16 + 1 2 8 + 1 2 16 = x + 1 + x + 1 2 8 2 8 \frac{x}{255}\approx\frac{x}{2^8}+\frac{x}{2^{16}}+\frac{1}{2^{8}}+\frac{1}{2^{16}}=\frac{x+1+\frac{x+1}{2^8}}{2^8} 255x28x+216x+281+2161=28x+1+28x+1
原式得证。
我的理解是,所谓的整数除255快速算法实质上是对整数除256的误差进行找补,且找补的部分为常数。为满足[0,65536]的范围内算法成立,故应取展开式误差部分的最大值。
另外,尝试误差部分仅取 1 2 8 \frac{1}{2^{8}} 281,则算法如下:

#define div_255_fast(x)    (((x) + (((x) + 256) >> 8)) >> 8)

此时,该算法在[0,65534]的范围内成立。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值