?

Log in

No account? Create an account
Занимательная математика у kunaifusu - Valse oubliée [entries|archive|friends|userinfo]
aruslan

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]
[ delicious | aruslan's delicious ]

Links
[Links:| Tags Profile Friends FG1 PP gamedev XNA FF Entries Comments Memories ]

Занимательная математика у kunaifusu [Feb. 27th, 2007|01:22 pm]
aruslan
[Tags|, , ]

Очень рекомендую к прочтению замечательную статью "Магия" kunaifusu про довольно стандартный трик магического преобразования floating point в int с помощью загадочных констант.

В статье очень детально и вкусно расписываются корни преобразования и происхождение чисел вроде
  (double)fp+6755399441055744.0

Что характерно, рассказывается как сделать это без double ;)

Помню своё удивление, когда я впервые увидел зубодробительные пассажи для табличного вычисления синусов и косинусов, которые начинались с характерного приведения аргументов
  inline float SinCosFast(float x, float &cosx) 
  {
    x= 0.159155f*x +1536.0f;
    ...
  }


Уже потом появились cvtps2pi, споры о тормозах, выравнивания, спецхинты и инструкции. Естественно, не везде (ц).

А тогда это было интересным и свежим взглядом на жизнь.

Особенно из-за явного джедайского форса.
Который молча рубил одной строчкой тупые брутальные
    const int a = *reinterpret_cast<const int*>(&fp);
    const int sign = (a>>31);
    const int mantissa  = (a&((1<<23)-1))|(1<<23);
    const int exponent  = ((a&0x7fffffff)>>23)-127;
    const int r         = ((unsigned int)(mantissa)<<8)>>(31-exponent);
    return ((r ^ (sign)) - sign ) &~ (exponent>>31);


Клёвая статья, спасибо! :)

Ну и танкистские ссылки напоследок:

1. "What Every Computer Scientist Should Know About Floating Point Arithmetic" by David Goldberg
2. "Let's Go to the (Floating) Point" by Chris Hecker
3. "Магия" by kunaifusu
4. "Origin of Quake3's Fast InvSqrt()" - Part I, читать камменты, Part II (via qiller_neu)
LinkReply

Comments:
[User Picture]From: qiller_neu
2007-02-27 02:17 pm (UTC)
Еще интересно "Origin of Quake3's Fast InvSqrt()"

http://www.beyond3d.com/articles/fastinvsqrt/
http://www.beyond3d.com/articles/fastinvsqrt2/

Там в комментах еще ссылок накидали на пейперы по теме.
(Reply) (Thread)
[User Picture]From: aruslan
2007-02-27 02:34 pm (UTC)
Да, история ж торчковая, точно :)
Забыл совсем.

Спасибо, qiller_neu! :)

P.S. Хотя кстате я это видел сильно задолго квейка и совсем не в геймдеве ;)
(Reply) (Parent) (Thread)
[User Picture]From: finnan
2007-04-20 04:17 pm (UTC)
(Reply) (Parent) (Thread)
[User Picture]From: aruslan
2007-07-17 05:23 am (UTC)
спасиб!
(Reply) (Parent) (Thread)
From: _zerg
2007-02-27 03:25 pm (UTC)
Кстати, пользуясь случаем: что про это скажешь? http://users.livejournal.com/_zerg/2006/12/02/
(Reply) (Thread)
[User Picture]From: aruslan
2007-02-27 04:12 pm (UTC)
"про это" - это про высокую прогрешность fast 1/sqrt? :)
ну дык она во-первых не такая уж и криминально высокая, а во-вторых у неё сфера применения довольно другая :)
(Reply) (Parent) (Thread)
From: _zerg
2007-02-27 04:20 pm (UTC)
ясно - значит я не правильно готовил кошек :)
ну криминально не криминально - но это погрешность вылезает в заметное дрожание модели :)
(Reply) (Parent) (Thread)
From: (Anonymous)
2007-03-18 06:16 pm (UTC)

Уточнение-добавление, вдруг кому нужно

В сборнике "Game Programming Gems" есть статья Yossarian King из Electronic Arts Canada
"Floating-Point Tricks:
Improving Performance with
IEEE Floating Point"
В ней помимо подробной "магии" floatint conversion рассказывается о сравнении, clamping, вычислении модуля и еще по мелочам.
Он там такты считать пытается (правда для pentium II, статья не новая), но есть мнение, что начиная с pentium IV особенного выигрыша от таких "магий" не будет.
(Reply) (Thread)
From: (Anonymous)
2007-03-18 06:18 pm (UTC)

Re: Уточнение-добавление, вдруг кому нужно

Поправка к называнию сборника - Game Gems [b]2[/b]
(Reply) (Parent) (Thread)
From: gpu_fil
2007-07-13 02:06 pm (UTC)

Однако невсегда данная штуковина работает...

Честн сказать не запаривался этой темой никогда (а зря, хотя может и нет=)), но вчера тупо зафигачил эту фишку в мою ГПУ-травку заместо (int)f.

Однако непрокатило.... трова поползла в тар-тарары, далее тупо попробовал метод с (double)....., ещё хуже=)))

Запариваться и разбиратся не стал (может опятьжетаки зря), ибо и других дел навалом, да и производительность бы неподнял практически (не трилиарды раз у мну флоат в инт кастуется, и это факт, VTune...). Ну ещё запариватся не стал, потому что, знакомый (во времена когда проц в 1Гц было чудо) долго пытался решить эту проблему, но в итоге только убил время.
(Reply) (Thread)
[User Picture]From: eurolexa
2008-10-02 03:39 pm (UTC)
вах, какая вкусняшка)) О_О вмимориз
давно такими трюками для целых чисел пользуюсь в виде хитых масок и бинарных операций, не знал что кто-то это с float использует..
(Reply) (Thread)