assembleur : multiplication de 2 nombres dans la norme IEEE - Programmation
Marsh Posté le 23-04-2001 à 16:20:12
Tu parles de la représentation IEEE des nombres flottants ?
Marsh Posté le 23-04-2001 à 21:46:01
Sur combien d'octets ? Parce que des représentations IEEE de flottants, il y en a pléthores ! J'ai déjà vu sur 4, 8 et 10 octets, et ça m'étonnerait pas qu'il y en ait d'autres !
Marsh Posté le 23-04-2001 à 22:48:42
Alors alors ... petit cours sur le format IEEE ...
Les nombres à virgule flottante sont stockés dans les huit registres internes du coprocesseur sous la forme du standard IEEE : signe, exposant et mantisse. Ces registres ont une taille interne de 80 bits.
les nombres flottants sont utilisables en deux formats : le format 32 bits correspond aux flottants "simple précision" (float en C) : 1 bit de signe, 8 bits pour l'exposant et 23 bits pour la mantisse. Le format 64 bits correspond à la "double précision" (double en C) : 1 bit de signe, 11 d'exposant et 52 de mantisse.
On a donc la représentation suivante, qui correspond à la représentation normalisée des nombres scientifiques (IEEE) :
f = (-1)^signe x 2^(exposant-biais) x 1,mantisse
où f désigne le nombre flottant. Le biais est une valeur permettant de coder un exposant positif; il dépend du format de codage : si e est le nombre de bits représentant l'exposant, le biais vaut :
biais = 2^(e-1) -1
soit par exemple 1023 pour une représentation 64 bits (11 bits d'exposant), 127 en 32 bits. Le 1 de la mantisse est implicite, et seule la partie suivante est stockée. La représentation normalisée est donc :
[ signe | exposant | mantisse ]
Codons par exemple 5,25 sur 32 bits. 5,25 vaut 2^2 + 2^0 + 2^-2, ce qui nous donne en binaire 101,01 ou encore 1,0101 x 2^2. L'exposant vaut donc 2+127. on a donc la représentation suivante :
0 10000001 01010000000000000000000
s exp mantisse
En C ça donne ça :
float f;
unsigned long mf = *(long *)&f; // représentation IEEE de f
unsigned long sign = mf&0x80000000; // signe
unsigned long exp = mf&0x7F800000; // exposant
unsigned long mantisse = mf&0x7FFFFF;
Dès lors il est possible d'effectuer des calculs sur les flottants à partir de leur représentation IEEE. Par exemple, élever un flottant à la puissance n :
Le flottant est de la forme f = s . 2^(127+e) . 1,m.
A la puissance n, on obtient :
f^n = s^n . 2^(127+n*e) . (1,m)^n
L'intérêt de la méthode réside en général dans l'accélération des caculs coûteux en cycles, tels que l'inverse (n=-1), la racine carrée (n=1/2) ou l'inverse de la racine carrée (n=-1/2).
Pour le signe et l'exposant c'est facile, pour la mantisse moins car il faut toujours se ramener à une représentation normalisée du type 1,m.
voili voilou...
j'espère que c'est pas trop confus.
[edit]--Message édité par z51--[/edit]
Marsh Posté le 23-04-2001 à 13:17:30
Comme j'ai dit dans le sujet je dois faire la multiplication de 2 nombres dans la norme IEEE et c'est assez balaise vu que je suis un débutant
Pouvez-vous m'aider ?
Merci d'avance