Быстрый обратный квадратный корень: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
Содержимое удалено Содержимое добавлено
Mercury (обсуждение | вклад) |
Mercury (обсуждение | вклад) |
||
Строка 262:
При желании можно перебалансировать погрешность, умножив коэффициенты 1,5 и 0,5 на 1,0009, чтобы метод давал симметрично ±0,09 % — так поступили<ref name="i76" /> в игре [[Interstate ’76]], которая также делает итерацию метода Ньютона.
Константа Уолша 0x5F3759DF ↔{{efn|Здесь стрелка ↔ означает объяснённую выше биекцию двоичного представления целого числа и двоичного представления числа с плавающей запятой в формате [[IEEE 754]].}} 1,4324301·2<sup>63</sup> оказалась очень хорошей. Крис Ломонт и Мэттью Робертсон незначительно уменьшили<ref name="lomont">{{Cite web |url=http://www.lomont.org/Math/Papers/2003/InvSqrt.pdf |title=Архивированная копия |access-date=2019-08-25 |archive-date=2009-02-06 |archive-url=https://web.archive.org/web/20090206040806/http://lomont.org/Math/Papers/2003/InvSqrt.pdf |deadlink=no }}</ref><ref name="robertson" /> предельную относительную погрешность, отыскав перебором константу{{efn|name=aa|1=Если в поле порядка поставить 127, получится 0x3FB75A86. Библиотека GRISU2, полностью целочисленная и не зависящая от тонкостей сопроцессора, говорит, что 0x3FB75A86 ↔ 1,43245 — это кратчайшее десятичное число, преобразующееся в данный ''float''. Однако всё-таки единица младшего разряда равняется 1,19·10<sup>−7</sup>, и 0x3FB75A86 = 1,432450056 ≈ 1,4324501. Следующее дробное 0x3FB75A87 ↔ 1,4324502 без всяких тонкостей. Отсюда неинтуитивное округление 1,
Чех Ян Ка́длец [[двоичный поиск|двоичным поиском]], а затем перебором в окрестности найденного улучшил алгоритм<ref name="kadlec">{{Cite web |url=http://rrrola.wz.cz/inv_sqrt.html |title=Řrřlog :: Improving the fast inverse square root<!-- Заголовок добавлен ботом --> |access-date=2023-04-08 |archive-date=2023-04-08 |archive-url=https://web.archive.org/web/20230408222901/http://rrrola.wz.cz/inv_sqrt.html |deadlink=no }}</ref>. Его метод даёт в 1,3 раза меньшую симметричную погрешность — не ±0,09 %, а ±0,065.
|