Brillianten 1/sqrt(x)

Fir e Vecteur ze normaliséiren, deelt een en duerch seng Norme. „Fréier“ woar dat allerdéngs relativ zäitopwenneg. Éischtens wéinst der racine carrée an zweetens wéinst der Divisioun. An 3D-Applicatioune muss dës Operatioun awer honnerten an dausende mol pro Sekonn ausgeféiert ginn. Hei kann et sech scho mol lounen ze optiméiren.
An hei ass sou eng optiméiert Method:
float InvSqrt (float x){
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}Fir et kuerz ze man, et ass Newton-Raphson mat enger eenzeger Iteratioun (Zeil 6). De groussen Trick läit an den Zeilen 3 a 4, wou e méiglechst gudde Startwert gesicht. Dobäi gëtt de
float x als int interpretéiert, an dono an enger Integer-Soustractioun benotzt! De float x gëtt also net ëmgewandelt, mee säi Bitmuster gëtt einfach als Integer ëminterpretéiert! Kann sou eng Operatioun iwwerhaapt e Sënn hunn? A virun allem, wat ass d’Bedeitung vum 0x5f3759df? Dës Froen ginn an engem interessanten Artikel vum Chris Lomont behandelt. Deen Artikel ass wierklech liesenswert fir jiddfereen deen iwwert dat néidegt Grondwësse verfügt. A méngen Aan illustréiert en och flott wat den Ënnerscheed tëscht Programméiren engersäits a Computer Science anerersäits ass.Hautdesdaags wir déi Method allerdings kontraproduktiv: modern Hardware huet spezialiséiert Circuiten fir dës an nach aner oft gebrauchten Operatiounen. An déi si méi séier wéi all Software-Implementatioun. Ech hoffen dass deen een oder aneren et trotzdem interessant fënnt.
(Fonnt via Slashdot)
Labels: Mathé

1 Kommentare:
Wow, dofir kennt een dach an d'C-Programméirer-Hell ;). Wierklech gail dat sou eppes funktionnéiert
Kommentar veröffentlichen
Abonnieren Kommentare zum Post [Atom]
<< Startseite