float Q rsqrt( float number ) < long i; float x2, y; const float threehalfs - x2 ■ number • O.S / программирование :: wtf :: Магия

программирование Магия wtf 
float Q rsqrt( float number )
<
long i; float x2, y;
const float threehalfs -
x2 ■ number • O.SF; y “ number;
1	-	• ( long • ) ty;
1	-	0x5f3759df - ( 1 »
y - • ( float • ) 41; y - y • ( threehalfs - (
//	y	-	y * ( threehalfs - (
1. SF;
l );
x2 * y * y ) >;
x2 • y • y ) ):
)
return y;
Подробнее
float Q rsqrt( float number ) < long i; float x2, y; const float threehalfs - x2 ■ number • O.SF; y “ number; 1 - • ( long • ) ty; 1 - 0x5f3759df - ( 1 » y - • ( float • ) 41; y - y • ( threehalfs - ( // y - y * ( threehalfs - ( 1. SF; l ); x2 * y * y ) >; x2 • y • y ) ): ) return y; Это • оригинальный кусок кода игры Quake 3 с комментариями Джона Кармака без каких либо изменений. // evil floating point bit level hacking // vhat the fuck? // 1st iteration // 2nd iteration, this can be removed
программирование,Магия,wtf
Еще на тему
Развернуть
Это вроде его знаменитый "обратный квадратный корень"?
Он самый. Под WTF подразумевается magic number, скорее всего. Магическим образом подобранный.
О том, что это - сильное программное колдунство я догадался, но не совсем понимаю как это работает, ибо не вдавался в подробности языка.
Это не подробности языка, это обыкновенная целочисленная математика(в просторечие алгебра, но это слово опошлено поколениями сопливых школьников, не подозревающих даже, на что замахиваются), которая затмевает даже матанализ и вплотную подбирается ко всяким ужасам вроде топологии и функционального анализа.
в программном коде было сильное колдунство с целочисленными значениями и значениями с плавающей запятой, и данным очень мощным колдунством выщитывался именно приблизительное значение обратного корня. В кваку освещение пилили и сделали под неё оптимизацию, сейчас такое колдунство не актуально, т.к расчёт формулой в лоб тотже матлаб делает быстрей, чем работает через алгоритм.
>> расчёт формулой в лоб тотже матлаб делает быстрей, чем работает через алгоритм

пардоньте, я тут пива попил и нихуя не понял. алгоритм матлаба быстрее алгоритма кваки или чо?
stfu stfu 16.11.201302:29 ответить ссылка 0.1
В принципе, любые современные математические пакеты сейчас проводят вычисления быстрей и точней, и необходимость подобного алгоритма отпала
Ты не совсем прав. Битовые операции быстрее хотя бы потому, что требуют меньше регистров для получения результата. Т.е. даже если само вычисление будет за то же самое время, то при битоёбстве будет лишний свободный регистр для использования прочим кодом и весь алгоритм в целом от этого выиграет. Но ты прав в том, что сейчас в этом нет необходимости, т.к. компы несколько мощнее, чем в те древние времена.
Я проверял, сейчас эта функция проигрывает даже 1.0f / sqrt( x )
ham2 ham2 16.11.201310:35 ответить ссылка 0.0
Поэтому я уточнил, что даже если сама функция работает медленнее, то за счёт большего числа свободных регистров в целом код может быть эффективнее.
Не говоря о том, что целочисленная арифметика до сих пор эффективнее вещественной. Как на x86/x64, так и на ARM. А вот между float и double разницы практически нет уже.
Точно он, я надолго запомнил этот чёртов корень, когда мне его надо было через матлаб и маткад собрать(безмысленно и беспощадно)
>>безмысленно
._.
инженеру можно :D
Окей-окей, я не сомневаюсь в твоей магии инженера.
Trust me! I'm engeneer!
это сюжет порно
usogon usogon 15.11.201320:49 ответить ссылка -0.8
одна из трех игр, в которые я играю))
Sterh Sterh 15.11.201320:52 ответить ссылка 0.1
Да, собственными глазами видел это в коде :)
А вообще для не слишком скилового разработчика там весь код примерно так выглядит.
ham2 ham2 15.11.201320:54 ответить ссылка 0.1
что этот код вообще делает? что такое 1.5F? это не плюсы, да?
AGIMgal AGIMgal 15.11.201320:54 ответить ссылка -0.2
Третий квей написан преимущественно на Си.
ham2 ham2 15.11.201320:55 ответить ссылка 0.1
Сказал так, как будто 1.5F - это невалидный литерал в плюсах. Но да, это не плюсы, выше уже ответили.
Так программист явно указывает, что хочет число типа float.
Не знаю, как там в Си, но предположу, что
1) Если не написать, получится double
2) При приведении double->float потеряешь точность, и *ненависть* у тебя получится совсем не полтора...
А что этот код делает - гуглится на раз по запросу "быстрый обратный квадратный корень"
richter richter 15.11.201321:22 ответить ссылка -0.1
межгалактический баян
serg9313 serg9313 15.11.201320:54 ответить ссылка -0.8
http://ru.wikipedia.org/wiki/Быстрый_обратный_квадратный_корень
antonc27 antonc27 15.11.201321:39 ответить ссылка 0.6
Я тоже иногда подобное встречаю. Как то ковырял одну игру и видел надпись "Greg balance me" возле одного из юнитов. Кстати, юнит то в банасе не был.
Morder07 Morder07 15.11.201321:45 ответить ссылка 0.1
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
Flying Delorean