Быстрый обратный квадратный корень: различия между версиями

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Строка 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=Неинтуитивное округление ''c''=1,432450084… до 1,4324500 на самом деле двойное: сначала к ближайшему двоичному (0x3FB75A86 ≈ 1,432450056), а потом к самому круглому десятичному — единица младшего разряда равняется 1,19·10<sup>−7</sup>, и 1,19·10<sup>−7</sup> / 2 & gt; 0,56, так что 1,43245 — самое круглое, преобразующееся в 0x3FB75A86.}} 0x5F375A86 ↔ 1,4324500·2<sup>63</sup>, а для ''double'' — 0x5FE6EB50C7B537A9. Правда, для double алгоритм бессмысленный (не даёт выигрыша в точности по сравнению с float)<ref name="robertson" />. Константу Ломонта удалось получить и аналитически ({{nobr|1={{math|''c''}} = 1,432450084790142642179}}){{efn|name=aa}}, но расчёты довольно сложны<ref name="robertson" /><ref name="moroz">{{Cite web |url=http://irbis-nbuv.gov.ua/cgi-bin/irbis_nbuv/cgiirbis_64.exe?C21COM=2&I21DBN=UJRN&P21DBN=UJRN&IMAGE_FILE_DOWNLOAD=1&Image_file_name=PDF%2FKtd_2014_32_6.pdf |title=Швидке обчислення оберненого квадратного кореня з використанням магічної константи — аналітичний підхід |access-date=2022-06-12 |archive-date=2022-04-17 |archive-url=https://web.archive.org/web/20220417200348/http://irbis-nbuv.gov.ua/cgi-bin/irbis_nbuv/cgiirbis_64.exe?C21COM=2&I21DBN=UJRN&P21DBN=UJRN&IMAGE_FILE_DOWNLOAD=1&Image_file_name=PDF%2FKtd_2014_32_6.pdf |deadlink=no }}</ref>. Крайний случай — константа Блинна 1,5 — даёт без перебалансировок и улучшений около −0,6 %<ref name="blinn" />.
 
Чех Ян Ка́длец [[двоичный поиск|двоичным поиском]], а затем перебором в окрестности найденного улучшил алгоритм<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.