Page 2 sur 2

nombre a virgule

Publié : 21 févr. 2007 16:09
par jojo
Salut a tous

comment coder 1.3 en binaire sur 6 bits?

merci de l'aide

Publié : 09 mars 2007 16:31
par marsu
Crées ta propre règle avec mantisse et exposant...

Publié : 21 mars 2007 6:31
par Tortue

C'est plus simple mais il a des contraintes comme le fait que ça ne soit pas adapté à la multiplication.
Bonjour à tous

Je me posais une question quand à l'utilisation de mots binaire à virgule fixe avec la multiplication. Prenons un exemple je souhaite multiplier 12.57 par 3.56
je code ces deux chiffres de cette manière :
12.57 = 1100,10010
3.56 = 0011,10001

Je fais : 1100 * 0011 = 100100 dans un premier temps
ensuite je fais 10001 * 1100 = 110,01100

J'ajoute 110 à 100100 et j'obtiens 101010
Je conserve 01100

Ensuite je fais 0011 * 10010 = 01,10110

J'ajoute 01 à 101010 et j'obtiens 101011
Je conserve 10110

Il ne me reste plus qu'à faire 10001*10010 = 100110010

Si je l'ajoute aux autres chiffres conservés (soulignés) j'obtiens 1010,10100

Addition finale : 1010 + 101011 = 110101

soit un résultat final de 110101,10100 = 53,625

Donc c'est faux car 12.57 * 3.56 = 44.7492

Où est ce que je me plante??? J'espère que vous arriverez à décripter mon charabia
:-D
Merci beaucoup pour votre aide!

Publié : 21 mars 2007 20:26
par lamygale
A vue de nez, je dirais que tu as gagné environ 10 en oubliant de diviser par 32 la multiplication des parties a virgule.
En effet elles ont égales à X=x/32 et Y=y/32 ( ou x et y sont des entiers)
donc X*Y=x*y / 1024 .

Ce format s'appele le Qk, et si on utilise le Q5 (5 bits apres la virgule comme pour ton exemple), si on multiplie A par B avec A et B en Q5,
C = A*B
Comme A et B sont de en Q5, cad que chacun est multipliés par 32 pour conserver une partie décimale, C est multiplié lui par 32*32 cad 1024.
Donc pour conserver le format Q5, on divise le résultat par 32.
Ainsi si on veut que A, B et C soient du Q5, on ecrit :
C = (A*B) >>5

Je pense pas etre clair, donc voici ce que tu dois faire :
Je fais : 1100 * 0011 = 100100 dans un premier temps
la tu as du Q0 donc tu multiplie decale a gauche de 5 bits.
ensuite je fais 10001 * 1100 = 110,01100
Q5 donc ok
Ensuite je fais 0011 * 10010 = 01,10110
idem
Il ne me reste plus qu'à faire 10001*10010 = 100110010
ici c'est du Q10 donc decale a droite de 5 bits.
on a donc
10010000000+
00011001100+
00000110110+
00000001001

ce qui donne 44,34 une fois divisé par 32.

Publié : 22 mars 2007 1:33
par Tortue
Ouah! merci pour cette réponse.

Par contre je remarque que l'on perd beaucoup en précision.
Y a-t-il moyen d'être plus précis sans augmenter le nombre de bits après la virgule?
De plus le nombre d'étapes de calcul pour réaliser une multiplication est impressionnant!
4 multiplications, 3 additions et un décalage. Y a-t-il une autre possibilité?

Merci.

Publié : 22 mars 2007 16:27
par lamygale
Comme je te l'ai dit, si tu peux multiplier 2 chiffres à n bits apres la virgule sans debordement, tu as juste à decaller à droite de n bits pour retrouver un resultat toujours avec n bits apres la virgule.

si A et B sont en Qk, et que tu veux que C le soit aussi, il suffit de faire :
C = (A*B)>>k

Publié : 03 avr. 2007 22:43
par wqa
Salut,

Concernant les Floating point, il y a une applet java qui m'a beaucoup servie, et qui peut aider à la compréhension, je vous laisse jeter un oeil si ca vous dit :

http://www.h-schmidt.net/FloatApplet/IEEE754.html

Mais là je cherche un programme (gratuit de préférence) qui puisse gérer une liste de floating point.
Par exemple je rentre plusieurs floating (single format) d'un coup et il me donne leur conversion d'un coup. Il me permet de les tracer. Il permet de calculer directement des opérations de floating point, etc..

Si quelqu'un connait un truc comme ca...?