1.12.06

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:

1 Kommentare:

Am/um 02.12.06, 14:12 , Anonymous Anonym meinte...

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