Швидкий обернений квадратний корінь

Для обчислення освітлення і віддзеркалення (показано у шутері від першої особи OpenArena) використовуються швидкий обернений квадратний корінь для обчислення кутів падіння і відбиття.

Швидкий обернений квадратний корінь (іноді згадуваний як Fast InvSqrt() або за шістнадцятковою сталою 0x5f3759df) — це метод обчислення , оберненого квадратного кореня для 32-бітного числа у форматі чисел з рухомою комою IEEE 754. Алгоритм ймовірно розробили у Silicon Graphics на початку 1990-х, і реалізація з'явилась 1999 року в сирцевому коді Quake III Arena, але метод не з'являвся на публічних форумах як-от Usenet до 2002 чи 2003.[1] (Існує обговорення на китайському форумі розробників CSDN у 2000.[2]) На той час, основна перевага алгоритму полягала у використанні замість обчислювально дорогих операцій над числами з рухомою комою операцій над цілими числами. Обернений квадратний корінь використовують для обчислення кутів падіння і відбивання для освітлення і шейдинга в комп'ютерній графіці.

Алгоритм приймає 32-бітне число з рухомою комою і зберігає його половинне значення для подальшого використання. Тоді, трактуючи числа з рухомою комою як цілі, виконується логічний зсув вправо на один біт і результат віднімається від магічного числа 0x5f3759df. Це буде першим наближенням до оберненого квадратного кореня вхідного числа. Знов трактуючи біти як число з рухомою комою проводиться одна ітерація методу Ньютона, щоб результат був точнішим. Так обчислення наближеного значення оберненого квадратного кореня для числа з рухомою комою відбувається приблизно вчетверо швидше ніж із використанням ділення чисел з рухомою комою.

Огляд коду

Наступний код є реалізацією оберненого квадратного кореня з Quake III Arena, з нього видалені директиви препроцесора, але залишені оригінальні коментарі:

float Q_rsqrt( float number )
{
	long i;
	float x2, y;
	const float threehalfs = 1.5F;

	x2 = number * 0.5F;
	y  = number;
	i  = * ( long * ) &y;                       // злий хак із рухомою комою на бітовому рівні
	i  = 0x5f3759df - ( i >> 1 );               // що за чортівня? 
	y  = * ( float * ) &i;
	y  = y * ( threehalfs - ( x2 * y * y ) );   // 1-ша ітерація
//	y  = y * ( threehalfs - ( x2 * y * y ) );   // 2-га ітерація, це можна видалити

	return y;
}

Для визначення оберненого квадратного кореня визначається наближення для , тоді за допомогою чисельного методу це наближення переглядається, щоб отримати прийнятну похибку у кінцевому результаті. Звичайні програмні методи на початку 1990-х отримували перше наближення із таблиці пошуку.[3] Цей шматок коду виявився швидшим ніж використання таблиці пошуку і приблизно в чотири рази швидший ніж звичайне ділення чисел з рухомою комою.[4] Хоча деяка втрата точності і відбувалася, але її перекривало значне покращення швидкодії.[5] Алгоритм був розроблений для специфікації IEEE 754-1985(інші мови) 32 бітних чисел з рухомою комою, але подальші дослідження Кріса Ломонта і Чарльза Макінері показали, що його можна реалізувати і для інших специфікацій.

Переваги у швидкості пропоновані швидким оберненим квадратним коренем з'явились завдяки трактуванню довгого слова[note 1], що містить число з рухомою комою як цілого і віднімання його від специфічної сталої, 0x5f3759df. Ціль цієї сталої не одразу очевидна для читача коду, отже, як і багато інших сталих знайдених у коді, її називають магічним числом.[1][6][7][8] Це цілочисельне віднімання і бітовий зсув дають довге слово, яке знов трактується як число з рухомою комою і є грубим наближенням оберненого квадратного кореня вхідного числа. Одна ітерація методу Ньютона виконується для отримання більшої точності, і код завершується. Алгоритм генерує прийнятно точні результати використовуючи унікальне перше наближення для методу Ньютона; однак, він набагато повільніший ніж використання SSE інструкції rsqrtss на x86 процесорах також випущеної у 1999.[9]

Робочий приклад

Як приклад, розглянемо число x = 0.15625, для якого ми хочемо обчислити 1/x ≈ 2.52982. Перші кроки алгоритму проілюстровані нижче:

0011_1110_0010_0000_0000_0000_0000_0000  Вигляд x та i на бітовому рівні
0001_1111_0001_0000_0000_0000_0000_0000  Зсув вправо на одну позицію: (i >> 1)
0101_1111_0011_0111_0101_1001_1101_1111  Магічне число 0x5f3759df
0100_0000_0010_0111_0101_1001_1101_1111  Результат 0x5f3759df — (i >> 1)

Використовуючи IEEE 32 бітове представлення:

0_01111100_01000000000000000000000  1.25 * 2^-3
0_00111110_00100000000000000000000  1.125 * 2^-65
0_10111110_01101110101100111011111  1.432430... * 2^+63
0_10000000_01001110101100111011111  1.307430... * 2^+1

Інтерпретування останнього бітового представлення як числа з рухомою комою дає наближення y = 2.61486, яке має похибку близько 3.4%. Після однієї ітерації метода Ньютона, кінцевим результатом є y = 2.52549, і помилка становить лише 0.17%.

Перебіг алгоритму

Алгоритм обчислює 1/x виконуючи такі кроки:

  1. Інтерпретує аргумент x як ціле, як спосіб приблизного обчислення log2(x)
  2. Використовує це наближення для обчислення наближення log2(1/x)
  3. Знов інтерпретує як число з рухомою комою, як спосіб для обчислення наближення 1/x
  4. Уточнює наближення використовуючи метод Ньютона.

Представлення чисел з рухомою комою

Оскільки алгоритм сильно покладається на представлення чисел одинарної точності з рухомою комою на бітовому рівні, короткий огляд цього представлення наведений тут. Для того, щоб закодувати ненульове дійсне число x як число із рухомою комою одинарної точності, перший крок полягає в записуванні x як нормалізованого двійкового числа:

де показник ex є цілим, mx ∈ [0, 1), і 1.b1b2b3... це двійкове представлення мантиси (1 + mx). Варто зазначити, що оскільки єдиний біт перед комою у мантисі завжди 1, то немає потреби його зберігати. З цієї форми маємо три беззнакові цілі числа:

  • Sx, знаковий біт, це 0 якщо x > 0, і 1 якщо x < 0 (1 біт)
  • Ex = ex + B — це зміщена експонента, де B = 127 — зсув[note 2] (8 бітів)
  • Mx = mx × L, де L = 223[note 3] (23 bits)

Ці поля пакуються зліва направо у 32 бітовий контейнер.

Як приклад розглянемо число x = 0.15625 = 0.001012. Нормалізація x дає:

і отже, три беззнакові цілочисельні поля такі:

  • S = 0
  • E = −3 + 127 = 124 = 011111002
  • M = 0.25 × 223 = 2097152 = 010000000000000000000002

ці поля пакуються як показано нижче:

Інтерпретування цілим як приблизний логарифм

Якби комусь довелось порахувати 1/x без комп'ютера чи калькулятора, то йому б стала в пригоді таблиця логарифмів разом із тотожністю logb(1/x) = −½ logb(x), яка дійсна для кожної основи b. Швидкий обернений квадратний корінь базується на цій тотожності і на факті, що інтерпретація float32 у ціле число дає грубе наближення цього логарифма. Ось як:

Якщо x це додатне нормальне число:

тоді ми маємо

але оскільки mx ∈ [0, 1), логарифм праворуч можна приблизно порахувати через [10]

де σ — це вільний параметр використовуваний для налаштування наближення. Наприклад, σ = 0 дає точний результат на обох кінцях інтервалу, тоді як σ ≈ 0.0430357 дає оптимальне наближення (найкраще у сенсі рівномірної норми похибки).

Інтерпретування числа з рухомою комою IEEE 754 x як цілого Ix (як-от C: float x = ...; int32_t i = * (int32_t *) &x;) дає масштабоване і зсунуте наближення логарифму з основою 2.

Отже, ми маємо наближення

З іншого боку, інтерпретування бітового представлення x як цілого дає[note 4]

Тоді виявляється, що Ix є масштабованим і зсунутим кусково-лінійним наближенням log2(x), як показано на зображенні праворуч. Інакше кажучі, log2(x) наближується за допомогою

Перше наближення результату

Обчислення y = 1/x базується на тотожності

Використовуючи наближення логарифму наведене вище, застосоване до обох x і y, рівняння дає:

З цього, наближення для Iy таке:

що записано в коді як

i  = 0x5f3759df - ( i >> 1 );

Перший доданок вище це магічне число

з якого можна зробити висновок, що σ ≈ 0.0450466. Другий доданок, ½ Ix, обрахований через бітовий зсув Ix на одну позицію праворуч.[11]

Метод Ньютона

Докладніше: Метод Ньютона

Після використання цих цілочисельних операцій, алгоритм знов розглядає довге слово як число з рухомою комою (y = *(float*)&i;) і виконує операцію множення із рухомою комою (y = y*(1.5f - xhalf*y*y);). Ця операція представляє одну ітерацію методу Ньютона. Тут ми маємо:

 — це обернений квадратний корінь, або, як функція від y,
.
As представляє загальне вираження методу Ньютона із як перше наближення,
де і .
Тому y = y*(1.5f - xhalf*y*y); є тим самим, що

Виноски

  1. Використання типа long зменшує переносність цього коду на сучасні системи. Для того, щоб код виконався правильно, sizeof(long) повинен бути 4 байти, інакше можна отримати від'ємний результат. На багатьох сучасних 64-бітних системах, sizeof(long) становить 8 байтів.
  2. Ex має бути в діапазоні [1, 254] для x, щоб бути представна як нормальне число.
  3. Єдиними числами представними точно як числа з рухомою комою це ті у яких Mx є цілим. Інші числа можна представити лише приблизно, округлюючи їх до найближчого цілого.
  4. Sx = 0 оскільки x > 0.

Примітки

  1. а б Sommefeldt, Rys (29 листопада 2006). Origin of Quake3's Fast InvSqrt(). Beyond3D. Архів оригіналу за 9 лютого 2009. Процитовано 12 лютого 2009.
  2. Discussion on CSDN. Архів оригіналу за 2 липня 2015. Процитовано 8 травня 2016.
  3. Eberly, 2001, с. 504.
  4. Lomont, 2003, с. 1.
  5. McEniry, 2007, с. 1.
  6. Lomont, 2003, с. 3.
  7. McEniry, 2007, с. 2, 16.
  8. Eberly, 2002, с. 2.
  9. Ruskin, Elan (16 жовтня 2009). Timing square root. Some Assembly Required. Архів оригіналу за 18 травня 2015. Процитовано 7 травня 2015. [Архівовано 2015-05-18 у Wayback Machine.]
  10. McEniry, 2007, с. 3.
  11. Hennessey & Patterson 1998, p. 305.

Документи

Read other articles:

Artikel ini tidak memiliki referensi atau sumber tepercaya sehingga isinya tidak bisa dipastikan. Tolong bantu perbaiki artikel ini dengan menambahkan referensi yang layak. Tulisan tanpa sumber dapat dipertanyakan dan dihapus sewaktu-waktu.Cari sumber: Agen, Lot-et-Garonne – berita · surat kabar · buku · cendekiawan · JSTOR Untuk pengertian lain, lihat Agen. Agen, Lot-et-GaronneVue Agen Koordinat: 44°12′18″N 0°37′16″E / 44.204...

 

This list of tallest buildings in Mexico ranks skyscrapers in Mexico by height. Tallest completed buildings This lists ranks completed and topped out buildings in Mexico that stand at least 150 metres (492 ft) tall, based on standard height measurement. This includes spires and architectural details but does not include antenna masts. An equal sign (=) following a rank indicates the same height between two or more buildings. An asterisk (*) indicates that the building is still under con...

 

Meniti Bianglala Mitch Albom, Pengarang Buku Meniti BianglalaPengarangMitch AlbomJudul asliThe Five People You Meet in HeavenNegaraAmerika SerikatGenreNovel FilsafatPenerbitHyperion Books, Edisi Bahasa Indonesia Gramedia Pustaka UtamaTanggal terbitEdisi Bahasa Inggris pada tahun 2003 Edisi Bahasa Indonesia pada tahun 2011Jenis mediaPrintHalaman208ISBNISBN 978-0-7868-6871-1OCLC52619795LCCPS3601.L335 Meniti Bianglala adalah sebuah novel karangan Mitch Albom yang diterbitkan di Am...

جنيه جنوب سودانيSouth Sudanese Poundجنيه واحد عليه صورة جون قرنق زعيم الحركة الشعبيةمعلومات عامةالبلد  جنوب السودانتاريخ الإصدار 2011رمز العملة Db رمز الأيزو 4217 SSPالمصرف المركزي بنك جنوب السودان المركزيموقع المصرف المركزي www.bosshq.netسعر الصرف دولار أمريكي = 14.4 جنيه جنوب سوداني[1]�...

 

Second Nanda ministryInterim Cabinet of the Republic of IndiaDate formed11 January 1966 (1966-01-11)Date dissolved24 January 1966 (1966-01-24)People and organisationsHead of stateSarvepalli RadhakrishnanHead of governmentGulzarilal NandaMember partyIndian National CongressStatus in legislatureMajority361 / 494 (73%)Opposition partyNoneOpposition leaderNoneHistoryElection(s)NoneOutgoing electionNoneLegislature term(s)13 daysPredecessorLal Bahadur Shast...

 

Saison 4 de Monk Données clés Série Monk Pays d'origine États-Unis Chaîne d'origine USA Network Diff. originale 8 juillet 2005 – 17 mars 2006 Nb. d'épisodes 16 Chronologie Saison 3 Saison 5Liste des épisodes de Monk modifier Cet article présente le guide des épisodes de la saison 4 de la série télévisée Monk (Monk). Distribution Acteurs principaux Tony Shalhoub (VF : Michel Papineschi) : Adrian Monk Traylor Howard (VF : Valérie Nosrée) : Natalie Teeger Te...

Kamen Rider: Dragon KnightPembuatShotaro IshinomoriPengembangSteve WangPemeranStephen LunsfordMatt MullinsAria AlistarLagu pembukaKamen Rider Dragon Knight oleh Cage9[1]DIVE INTO THE MIRROR oleh Defspiral (Versi Jepang)Lagu penutupANOTHER WORLD oleh Kit×Len (Tatsuhisa Suzuki & Satoshi Matsuda) (Versi Jepang)Penata musikTony PhillipsNegara asal Amerika Serikat Jepang IndonesiaBahasa asliInggris, IndonesiaJmlh. episode40[2] (daftar episode)ProduksiProduser eksekutifY...

 

Open source raster graphics editor For other uses, see Gimp (disambiguation). GNU Image Manipulation ProgramGIMP version 2.10Original author(s)Spencer Kimball, Peter MattisDeveloper(s)GIMP Development TeamInitial release2 June 1998; 25 years ago (1998-06-02)Stable release2.10.36[1]  / 7 November 2023Preview release2.99.18[2]  / 21 February 2024 Repositorygitlab.gnome.org/GNOME/gimpWritten inC, C++, Python, SchemeOperating systemLinux, macOS, Windows...

 

Japanese baseball player Baseball player Kazuyuki AtsuzawaOrix Buffaloes – No. 75Pitcher / CoachBorn: (1972-08-11) August 11, 1972 (age 51)Saitama, JapanBatted: LeftThrew: LeftNPB debutMay 14, 1995, for the Nippon Ham FightersLast NPB appearanceSeptember 6, 2003, for the Nippon Ham FightersNPB statistics (through 2003)Win–loss record0–4Earned run average5.37Strikeouts59Saves0 TeamsAs Player Nippon Ham Fighters (1995 – 2003) As Coach Hokkaido Nippon-H...

Hurricane season in the Pacific Ocean 1969 Pacific hurricane seasonSeason summary mapSeasonal boundariesFirst system formedJune 9, 1969Last system dissipatedOctober 23, 1969Strongest stormNameDoreen • Maximum winds85 mph (140 km/h)(1-minute sustained) • Lowest pressure993 mbar (hPa; 29.32 inHg) Seasonal statisticsTotal depressions15Total storms10Hurricanes4Total fatalities1 direct, 9 indirectTotal damageUnknownRelated articles 1969 Atlantic hurricane season 1969 Pacifi...

 

Este artículo o sección necesita referencias que aparezcan en una publicación acreditada. Busca fuentes: «Oretania» – noticias · libros · académico · imágenesEste aviso fue puesto el 9 de noviembre de 2011. Oretania Región Situación de Oretania en la península ibérica sobre las provincias actuales.Capital CástuloEntidad Región • Cultura IberaHabitantes OretanosCorrespondencia actual  Provincia de Jaén Provincia de Albacete Provincia...

 

First mandatory prayer of the day in Islam Fajr redirects here. For other uses, see Fajr (disambiguation). Some of this article's listed sources may not be reliable. Please help improve this article by looking for better, more reliable sources. Unreliable citations may be challenged and removed. (April 2024) (Learn how and when to remove this message) Part of a series onIslam Beliefs Oneness of God Angels Revealed Books Prophets Day of Resurrection Predestination Practices Profession of Faith...

Iranian footballer and manager (born 1969) This article is about the Iranian footballer. For the Senegalese footballer, see Ali Dia. For the Guinean footballer, see Ali Badara Dia. Ali Daei Daei in 2019Personal informationFull name Ali Daei[1]Date of birth (1969-03-21) 21 March 1969 (age 55)Place of birth Ardabil, IranHeight 1.89 m (6 ft 2 in) [2]Position(s) Centre forwardYouth career1983–1987 Esteghlal ArdabilCollege careerYears Team Apps (Gls)2007 Islam...

 

Державний комітет телебачення і радіомовлення України (Держкомтелерадіо) Приміщення комітетуЗагальна інформаціяКраїна  УкраїнаДата створення 2003Керівне відомство Кабінет Міністрів УкраїниРічний бюджет 1 964 898 500 ₴[1]Голова Олег НаливайкоПідвідомчі ор...

 

Sebuah tabung torpedo kapal permukaan Mark-32 Mod 15 menembakkan sebuah torpedo Mark-46. Torpedo adalah proyektil berpenggerak sendiri yang ditembakkan di atas atau di bawah permukaan laut dan kemudian meluncur di bawah permukaan laut dan dirancang untuk meledak pada kontak atau pada jarak tertentu dengan target. Torpedo dapat diluncurkan dari kapal selam, kapal permukaan, helikopter atau pesawat. Torpedo juga dapat menjadi senjata dari senjata lainnya. Torpedo Mark 46 dari Amerika Serikat da...

كليمنت الثاني عشر (باللاتينية: Clemens PP. XII)‏  معلومات شخصية اسم الولادة (بالإيطالية: Lorenzo Corsini)‏  الميلاد 7 أبريل 1652(1652-04-07)فلورنسا الوفاة 6 فبراير 1740 (87 سنة)روما مكان الدفن كاتدرائية القديس يوحنا اللاتراني  الإقامة فلورنسا  مواطنة الدولة البابوية  الديانة الكنيسة ا...

 

The following is a list of notable musicians who compose or have composed Celtic fusion music. Shooglenifty playing at Celtic Connections 2007 Contents:  Top 0–9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A Afro Celt Sound System B Bad Haggis featuring Eric Rigler Baka Beyond Bodega Bongshang Beltaine's Fire Martyn Bennett Blaggards C Capercaillie Carbon Leaf Ceredwen Clannad The Corrs Croft No. 5 The Crossing Cruachan D The Dreaming Dropkick Murphys E Enter the Haggis En...

 

خريطة ببلديات هولندا بعد عمليات الدمج 1 يناير 2019 يوجد في هولندا 355 بلدية (بالهولندية: Gemeenten) و3 هيئات عامة (Lichamen openbare)، ويشار إليها أيضاً في هولندا باسم «البلديات الخاصة (Bijzondere gemeenten)». البلديات هي تقسيم إداري من المستوى الثاني في هولندا وتقسيمات فرعية من مقاطعاتها التابعة لها....

Indian-Canadian communist (1939–1997) Hardial BainsBains in 1979First Secretary of the Communist Party of Canada (Marxist–Leninist)In office1970–1997Preceded byPosition establishedSucceeded bySandra Smith Personal detailsBorn(1939-08-15)15 August 1939Chak 6, Punjab, British IndiaDied24 August 1997(1997-08-24) (aged 58)Quebec, CanadaNationalityCanadianPolitical partyCommunist Party of Canada (Marxist–Leninist)Other politicalaffiliationsCommunist Party of Ireland (Marxist–Leninis...

 

United States federal law This article includes inline citations, but they are not properly formatted. Please improve this article by correcting them. (July 2019) (Learn how and when to remove this message) The Civil Rights of Institutionalized Persons Act (CRIPA) of 1980 is a United States federal law[1] intended to protect the rights of people in state or local correctional facilities, nursing homes, mental health facilities, group homes and institutions for people with intellectual...