Строка из Quake III, которая выглядит как колдовство

Строка из Quake III, которая выглядит как колдовство

i = 0x5f3759df - (i >> 1); // what the fuck?

Комментарий настоящий. Эта строка помогает вычислить 1/√x, не извлекая квадратный корень. В графике такая операция нужна для нормализации векторов: привести их длину к единице, сохранив направление.

Как работает трюк?

У float внутри есть показатель степени и дробная часть. Если прочитать биты положительного нормализованного числа как целое, получится величина, которая примерно соответствует его логарифму с масштабом и смещением.

А дальше используется свойство:

log₂(1/√x) = −½ × log₂(x)

Сдвиг >> 1 делит целое число на два. Вычитание из подобранной константы меняет знак и компенсирует смещение. Полученные биты снова читаются как float: это уже приближение к ответу.

Один шаг метода Ньютона доводит относительную погрешность примерно до 0,18%. В историческом тесте Криса Ломонта функция работала примерно в четыре раза быстрее прямого вычисления 1.0 / sqrt(x).

А закомментированная строка на картинке? Это второй шаг Ньютона: ещё больше точности за дополнительные вычисления.

💡 Красота алгоритма в том, что само представление числа в памяти становится частью вычисления.

https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/q_math.c