Je sais pas trop ce que veut dire virgule fixe dans le domaine du son, mais je peux t'expliquer ce que ca veut dire dans le domaine de la 3D, et a mon avis ca doit etre la meme chose.
Mettons que tu veuilles faire des calculs 3D (ou de sons) en assembleur pour optimiser certaines routines. Comment est ce que tu vas calculer cos(x) * sin(x) - cos(y) * sin(y) par exemple ?
En assembleur tu vas etre un peu mal.
Parmi les solutions tu as les calculs en virgule fixe, c'est a dire que tu vas emuler des calculs flottants avec des entiers.
Pour faire ca, tu as d'abord une phase de conversion de tes flottants en les multipliant par un nombre qui va bien (en general un multiple de 2 parce que ca va plus vite a multiplier). Tu fais ensuite tes calculs en verifiant toujours que tes nombres sont toujours homogenes a un nombre multiplie par ton facteur, et uniquement a la fin tu fais la division inverse.
Du coup, la plupart du temps tu as fais des multiplications et des divisions de nombre entier qui representent en fait des nombres flottants, et tu es sauve : tu peux coder ta routine en assembleur.
Ici ca vaut pas trop le coup, puisque tu as une seule ligne de calcul, mais si tu as precalcule plusieurs valeurs de cos de sin, et que tes calculs sont plus compliques (multiplication de matrice 4D, transformation de fourrier ou autre), tu transformes pas loin de 90% de ton code en virgule flottante en code manipulant des entiers (virgule fixe)
[^] # Re: Virgule Fixe
Posté par Epsos . En réponse à la dépêche Tremor est passé sous licence BSD. Évalué à 10.
Mettons que tu veuilles faire des calculs 3D (ou de sons) en assembleur pour optimiser certaines routines. Comment est ce que tu vas calculer cos(x) * sin(x) - cos(y) * sin(y) par exemple ?
En assembleur tu vas etre un peu mal.
Parmi les solutions tu as les calculs en virgule fixe, c'est a dire que tu vas emuler des calculs flottants avec des entiers.
Pour faire ca, tu as d'abord une phase de conversion de tes flottants en les multipliant par un nombre qui va bien (en general un multiple de 2 parce que ca va plus vite a multiplier). Tu fais ensuite tes calculs en verifiant toujours que tes nombres sont toujours homogenes a un nombre multiplie par ton facteur, et uniquement a la fin tu fais la division inverse.
Du coup, la plupart du temps tu as fais des multiplications et des divisions de nombre entier qui representent en fait des nombres flottants, et tu es sauve : tu peux coder ta routine en assembleur.
Ex :
cx = cox(x) * 655536;
sx = sin(x) * 655536;
cy = cos(y) * 655536;
sy = sin(y) * 655536;
r = (cx * sx - cy * sy) >> 16;
resultat_final = r >> 16;
Ici ca vaut pas trop le coup, puisque tu as une seule ligne de calcul, mais si tu as precalcule plusieurs valeurs de cos de sin, et que tes calculs sont plus compliques (multiplication de matrice 4D, transformation de fourrier ou autre), tu transformes pas loin de 90% de ton code en virgule flottante en code manipulant des entiers (virgule fixe)
A+