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é