function Q_rsqrt de John Carmak !
Publié : mer. 18/nov./2009 21:11
Bon tout le monde connait John Carmak ! Et en consultant sa fiche sur Wiki pedia
http://fr.wikipedia.org/wiki/John_Carmack
j'ai découvert une de ses fonctions (C) pour calculer l'inverse d'une racine.Cette fonction est pour le moins particulière puisqu'elle ne contient aucune boucle, elle ne fait intervenir qu'une suite de calculs élémentaires! Pour autant, celle-ci fournit des approximations tout à fait acceptables (de l'ordre de 10-3). Elle est même jusqu'à 4 fois plus rapide que la fonction sqrt(float x) et se révèle ainsi parfaite pour un jeu vidéo.
et j'ai donc voulu la transposé (pour m'amuser) en PB
Mais je bloc sur un certain nombre de truc ... voici la function d'origine
et voilà ce que j'ai réussi a faire .... Comme vous pouvez le remarquer il y a pas mal de chose que je n'ai pas su transposer !
il y a le 1.5F et 0.5F et les deuxième calcul de i et de y ! Si quelqu'un a une idée ...
enfin voilà je voulais testé !
je me dis qu'en regardant dans le code source de Quake3 on pourrait trouver quelques bonnes fonction a transposer .. 
http://fr.wikipedia.org/wiki/John_Carmack
j'ai découvert une de ses fonctions (C) pour calculer l'inverse d'une racine.Cette fonction est pour le moins particulière puisqu'elle ne contient aucune boucle, elle ne fait intervenir qu'une suite de calculs élémentaires! Pour autant, celle-ci fournit des approximations tout à fait acceptables (de l'ordre de 10-3). Elle est même jusqu'à 4 fois plus rapide que la fonction sqrt(float x) et se révèle ainsi parfaite pour un jeu vidéo.
et j'ai donc voulu la transposé (pour m'amuser) en PB
Mais je bloc sur un certain nombre de truc ... voici la function d'origine
Code : Tout sélectionner
float Q_rsqrt( float number ){
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) ); // bk010122 - FPE?
#endif
#endif
Return y;
}
il y a le 1.5F et 0.5F et les deuxième calcul de i et de y ! Si quelqu'un a une idée ...
Code : Tout sélectionner
Procedure Q_rsqrt(number.f)
Protected i.l,x2.f,y.f
#threehalfs=1.5
x2 = number * 0.5
y=number
i= ????????????
y= $5f375a86 - ( i >> 1 ); // what the fuck? better magic key than john Carmak
y = ????????
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
ProceduRereturn y
EndProcedure

