FDLIBM (свободно распространяемая LIBM) имеет довольно хорошую документированную версию sqrt. e_sqrt.c .
Имеет одну версию, которая использует целочисленную арифметику и формулу повторения, изменяющую один бит за раз.
Другой метод использует метод Ньютона.Он начинается с некоторой черной магии и таблицы поиска, чтобы получить первые 8 битов, а затем применяет формулу повторения
y_{i+1} = 1/2 * ( y_i + x / y_i)
, где x - это число, с которого мы начали.Это вавилонский метод метода Герона.Он восходит к Герою Александры в первом столетии нашей эры.
Существует еще один метод, называемый Быстрый обратный квадратный корень или возвратно-поступательный.который использует некоторый «злой хакерский уровень с плавающей запятой», чтобы найти значение 1 / sqrt (x).i = 0x5f3759df - ( i >> 1 );
Он использует двоичное представление числа с плавающей запятой с использованием мантиссы и экспоненты.Если наше число x равно (1 + m) * 2 ^ e, где m - мантисса, а e - показатель степени, а результат y = 1 / sqrt (x) = (1 + n) * 2 ^ f.Взятие логов
lg(y) = - 1/2 lg(x)
f + lg(1+n) = -1/2 e - 1/2 lg(1+m)
Итак, мы видим, что экспоненциальная часть результата равна -1/2 экспоненты числа.Черная магия в основном выполняет побитовый сдвиг показателя степени и использует линейное приближение для мантиссы.
Как только вы получите хорошее первое приближение, вы можете использовать методы Ньютона, чтобы получить лучший результат, и, наконец, немного побитового уровня, чтобы исправить последнюю цифру.