用牛顿法近似计算255/sqrt(x)的推导与代码错误排查求助
用牛顿法近似计算255/sqrt(x)的推导与代码错误排查求助
我现在想在一个除法和sqrt()操作开销很大的架构上,用牛顿法来近似计算255 / sqrt(x),避免直接使用这些昂贵的操作。
我的推导过程如下:
y = 255 / sqrt(x) 255 / y^2 = x f(y) = 255 / y^2 - x = 0 y[n+1] = y[n] - f(y) / f’(y) f’(y) = -510 / y^3 y[n+1] = y[n] - (255 / y[n]^2 - x) / (-510 / y[n] ^ 3) y[n+1] = 3/2 * y[n] - x * y[n]^2 / 510
我用下面这段代码做了测试:
# what I want is 255 * isqrt(x) or 255 / sqrt(x) def inverse_sqrt_newton_255(x, iterations=5): y = 255. / x for _ in range(iterations): y = (1.5 * y) - (x * y * y / 510.) return y
但我发现结果总是差了sqrt(x)这个因子:
比如inverse_sqrt_newton_255(25) = 10.2,而正确结果应该是51。
我当然可以把结果乘以sqrt(x),但这就违背了我要避免sqrt()操作的初衷。
作为参考,下面这段计算1 / sqrt(x)的代码是能正常工作的:
def inverse_sqrt_newton(x, iterations=5): y = 1.0 / x for _ in range(iterations): y = y * (1.5 - 0.5 * x * y * y) return y
到底是哪里出错了呢?
备注:内容来源于stack exchange,提问作者the five states
相关产品推荐
相关产品推荐

