Мой вывод:
Код: Выделить всё
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
Код: Выделить всё
inverse_sqrt_newton_255(25) = 10.2
Очевидно, я мог бы умножить результат на 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
Подробнее здесь: https://stackoverflow.com/questions/792 ... ons-method