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

