Это намного старше, чем Quake III , хотя точная магическая константа немного изменилась.
Кодирование конечного числа с плавающей запятой одинарной точности числав соответствии с IEEE-754 (который используется большинством современных компьютеров) это
31 30 23 22 0
├─┼─┬─┬─┬─┬─┬─┬─┬─┼─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┤
│S│ Exponent │ Mantissa │
└─┴───────────────┴─────────────────────────────────────────────┘
Старший бит S
является знаком.Значение является отрицательным, если оно установлено, положительным в противном случае.
Если Exponent
и Mantissa
оба равны нулю, то значение равно либо 0,0 (если S
равно нулю), либо -0,0 (если S
равно 1).
Если Exponent
равно нулю, но Mantissa
ненулевое, у вас есть ненормальное число очень близко к нулю.
Представления, где Exponent
- 255 (все установленные биты) зарезервированы для бесконечности (если Mantissa
- ноль), а не для числа (если Mantissa
не равен нулю).
Для значений Exponent
от 1до 254 включительно, Mantissa
содержит дробных битов мантиссы с неявным 1 в целой позиции (это то, что означает (1)
, например, 0 10000001 (1)1011011011011011011011
.) Другими словами,значение Mantissa
представляет для этих Exponent
значений от 1.00000000000000000000000 2 (1,0 в десятичном виде) до 1,11111111111111111111111 2 (1,999999994 в десятичном виде) включительно.
Теперь, если мы рассмотрим только неотрицательные значения (с полем S
), с E = Exponent
(между 1 и 254 включительно), and M логическое значение Mantissa
(между 1.0 и 1.99999994), затем значение V , представляющее собой плавающую точку одинарной точности, равно
V = 2 E - 127 × M
127 - это смещение показателя степени.Корень квадратный из V равен
√ V = 2 ( E - 127) / 2 × √ M = 2 E / 2 - 127 × 2 63 × √2 × √ M
и обратный квадратный корень, который здесь является целевой операцией,
1 / √ V = 2 (127 - E ) / 2 × 1 / √ M = 2 - E / 2 - 127 × 2 63 × √2 × 1 / √ М
отмечая, что 2 127/2 = 2 63,5 = 2 63 × √2.
Если мы возьмем целочисленное представление и сместим его на один бит вправо, мы фактически уменьшим вдвое E .Чтобы умножить на 2 63 , нам нужно добавить 63 к показателю степени;63 × 2 23 .Однако для операции с квадратным корнем вместо умножения на √2 × √ M мы фактически просто умножаем на M / 2.Это означает, что это (смещение целочисленного представления на один бит вправо, затем добавление 63 к показателю степени) дает оценку квадратного корня, которая отклоняется с коэффициентом от 0,7071067 до 0,75 для аргументов, превышающих 1,0, и с коэффициентом между 0,7071067 и1448,155 для значений от 0 до 1. (Это дает 5,421 × 10 -20 для √0 и 0,75 для √1.)
Обратите внимание, что для операции с обратным квадратным корнем мы хотимдля отрицания E .
Оказывается, что если вы сдвинете целочисленное представление вправо на один бит, а затем вычтите это из (1 01111100 1101110101100111011111) 2 (1597463007в десятичном виде, 0x5f3759df в шестнадцатеричном виде, приближение с плавающей точкой одинарной точности √2 127 ≈ 13043817825332782212), вы получите довольно хорошее приближение обратного корня квадратного (1 / √ V * 1138)*).Для всех конечных нормальных аргументов приближение отклоняется от 0,965624 до 1,0339603 с правильным значением;очень хорошее приближение!Все, что вам нужно, это одна или две итерации метода Ньютона для обратной квадратной операции сверху.(Для f ( X ) = 0 тогда и только тогда X = 1 / √ V вам нужно f ( X ) = 1 / X ^ 2 - V . Таким образом, каждая итерация в X равна X - f ( X ) / f '( X ) = X × (1,5 - 0,5 × V × X × X . Что должно выглядетьдовольно знакомо.)