Calcul binaire

Résolu/Fermé
badcommand Messages postés 84 Date d'inscription mardi 14 avril 2009 Statut Membre Dernière intervention 10 décembre 2010 - 15 nov. 2009 à 22:31
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 16 nov. 2009 à 01:52
Bonjour,
Je suis entrain d'étudier la représentation de flottants avec la norme IEE 754, et j'ai appris la méthode de la multiplication par 2 de la partie fractionnaire. L'exemple de mon cours est 0,625, donc aucun souci,en multipliant par 2 la partie fractionnaire à chaque fois, on finit bien par tomber sur 0.
0.625*2 = 1 + 0,25
0,25*2 = 0 + 0,5
0,5 * 2 = 1 + 0
0 * 2 = 0

J'ai donc mon 0,101 en base 2. Le problème, c'est que cette méthode ne marche pas sur les valeurs terminant autrement que par 5. Je me demandais donc si vous aviez quelques pistes pour moi.
Je précise qu'il ne s'agit pas de m'aider à faire mes devoirs (avis aux modos qui voudraient effacer ce message) mais juste de faire en sorte que je comprenne mieux un sujet qui me semble flou.

Merci beaucoup

7 réponses

badcommand Messages postés 84 Date d'inscription mardi 14 avril 2009 Statut Membre Dernière intervention 10 décembre 2010 9
15 nov. 2009 à 23:25
up! Merci
0
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 657
15 nov. 2009 à 23:34
oui absolument, c'est même normal !

ces nombres sont des fractions.

Certaines fractions en base 10 (dans nos nombres) ont un "développement décimal" (une écriture) qui ne s'arrette jamais ! (comme 1/3, 1/6, 1/7, 1/9, etc...) en fait, en décimal toute fraction avec le dénominateur qui est un multiple de autre chose que 2 et 5 a un développement décimal qui ne se termine jamais. idem en binaire, sauf que là c'est tous le nombres qui au dénominateur sont des multiples d'autre chose que 2.

Ex : 0.6 en décimal c'est comme 6/10 ou simplifié c'est 3/5. 5 est divisible par ... 5 donc il y a un diviseur qui n'est pas deux, et donc en binaire le nombre a un "développement infini périodique".

0.42 = 42/100 = 21/50. 50 est encore divisible par 5 (par exemple) et donc ne peut pas s'écrire avec des "un nombre fini de chiffres après la virgule".

Encore une fois, c'est vraiment le même phénomène que lorsque tu essayes d'écrire 1/3, pas possible que ça se termine en décimal (ni en binaire).
0
badcommand Messages postés 84 Date d'inscription mardi 14 avril 2009 Statut Membre Dernière intervention 10 décembre 2010 9
15 nov. 2009 à 23:40
Très clair, merci... Ca tombe sous le sens. Mais dans ce cas comment ces valeurs sont elles représentées? (sur 32 bits par exemple...).
Si je prends par exemple 0,142, comment ça se passe, on remplit les bits jusqu'à plus de place ou on utilise une autre méthode ?
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 147
15 nov. 2009 à 23:43
Où est le problème ? Tu arrêtes tes multiplications quand tu estimes que tu as assez de chiffres après la virgule.
Prenons par exemple 0,626, on aura successivement:
1,252
0,504
1,008
0,016
0,032
0,064
0,128
0,256
0,512
1,024
0,048
0, ...
Tu peux continuer jusqu'à un nombre infini. En étant 'raisonnable', tu obtiendras donc: 0,10100000010...
Bonne continuation.
0
badcommand Messages postés 84 Date d'inscription mardi 14 avril 2009 Statut Membre Dernière intervention 10 décembre 2010 9
15 nov. 2009 à 23:49
Bien... vu comme ça, effectivement. Le truc c'est que j'arrive pas bien à intégrer comment le cpu peut arriver à faire des calculs de grande précision du genre 8,1245879 * 16,47899 si les valeurs stockées en mémoires sont "approximatives" (toutes proportions gradées). Mais bon si tu dis que ce n'est pas un problème, je devrais bien finir par faire la connexion...

Merci beaucoup
0
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 657 > badcommand Messages postés 84 Date d'inscription mardi 14 avril 2009 Statut Membre Dernière intervention 10 décembre 2010
15 nov. 2009 à 23:56
et bien oui, un ordinateur ne peut stocker qu'un nombre fini de choses. Il y a une infinité de nombres à virgules... il y a donc forcément des nombres qui ne peuvent être exactement donnés.

Mais avec les standards de quadruple précision, on atteint déjà une précision très acceptable.

Néanmoins, il faut faire EXTREMEMENT attention lorsque tu soustrais deux nombre d'ordre de grandeur comparable, car il peut y avoir une grosse perte de précision dans ces cas-là.

Ex : je veux faire 1/3 (0.33333333.....) moins 0.3333 en décimal avec 5 chiffres significatifs.

en vrai, ça fait (0.000033333333....., 3.3333 * 10^-5 en notation scientifique)
sur la machine : 0.33333 - 0.33330 = 0.00003 = 3 *10^-5

On a perdu une précision de 10% ! et ça peut être bien pire. Fait gaffe à ces soustractions.

(si les nombres soustraits sont très différents en ordre de grandeur pas trop de problème)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 657
15 nov. 2009 à 23:48
exactement.

C'est pour ça que, dans le standard IEEE par exemple, il y a un certain nombre de "bits" de "mantisse", et un certains nombre de bits pour "l'exposant".

Ex : en supposant qu'il y a 8 "chiffres décimaux" (au lieu de bits), la fraction "1/3" (c-à-d le nombre 0.3333333333.....) sera écrit, et donc arrondi, en 3.33333 * 10^-1 (le -1 est ici "l'exposant").

En binaire, ça donnerait 0.0101010101010101010....., ce qui sera arrondi à 1.01011 * (10)^-10
(note : je ne me souviens plus si le nombre est arrondi à 1.01011 ou tronqué à 1.01010, mais je pense qu'il est arrondi)

ATTENTION ! j'ai tout écrit en binaire ici, les 10 c'est notre 2

Petite subtilité : en décimal on pourra avoir 1, 2, 3, 4, 5, ... 9 juste avant la virgule. En binaire il ne peut y avoir que "1" en écriture scientifique. Ce 1 est implicitement là dans le standard IEEE, il n'est pas stocké (le 1 avant la virgule). Dans mon exemple avec les décimaux j'ai un peu triché car je n'ai pas compté le premier 3 dans les chiffres significatifs.

Je ne sais pas si j'ai été très clair...
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 147
16 nov. 2009 à 00:09
Je ne vois pas l'intérêt de l'arrondi.
Staistiquement, donc en moyenne et comme nous sommes en binaire, on fait la même erreur en arrondissant au supérieur qu'en arrondissant à l'inférieur; or, en arrondissant à l'inférieur (ce qui consiste, comme tu le dis, à tronquer), on fait une opération beaucoup plus simple qu'en arrondissant au supérieur (arrondir 0,10111 au supérieur reviens à écrire: 0,1100).
En conséquence, je parierais qu'il a été choisi de tronquer... mais ce n'est qu'un pari ;-)
Bonne nuit.
0
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 657 > loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017
16 nov. 2009 à 01:09
non, c'est faux loupius ;) . Exemple en décimal : 0.1, 0.2, 0.3, 0.4 s'arrondissent à 0 car ils sont plus proches et 0.6 0.7 0.8 0.9 à 1 car ils sont plus proches de 1, ça c'est évident tu en conviendras.
En binaire de toute façon on n'a que le 0.5 en quelques sorte (0.1).

Mais justement, le 0.5 s'arrondi toujours au dessus, à 1. Idem en binaire.

Il y a une bonne raison à cela : 0.5 est en effet à égale distance de 0 et de 1 (donc si c'était juste pour lui ce ne serait qu'une convention), mais il y a tous les nombres avec 0.5 au début : 0.51, 0.52, 0.53 ... 0.501, 0.5001, etc.... ceux-là sont tous plus proche de 1 que de 0.
Et c'est la même chose en binaire : il y a 0.1, 0.11, 0.101, etc... qui sont tous plus proches de 1. Donc on doit appliquer la même règle que pour le 0.5 en décimal. : 0.1 s'arrondi en 1 pas en 0
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 147 > Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013
16 nov. 2009 à 01:52
Logiquement, j'aurais donc probablement perdu mon pari car je pense que ton raisonnement est évidemment correct.
Je viens de relire le fonctionnement d'un vieux coprocesseur (le 8087), il dispose de tout ce qu'il faut pour configurer l'arrondi que l'on désire. En conséquence, il n'y a aucune raison pour ne pas appliquer l'arrondi supérieur qui donne donc la moindre erreur.
Même si j'ai fait une mauvaise hypothèse, je ne regrette pas d'avoir soulevé ce lièvre ;-)
Merci et bonne nuit.
0
badcommand Messages postés 84 Date d'inscription mardi 14 avril 2009 Statut Membre Dernière intervention 10 décembre 2010 9
16 nov. 2009 à 00:01
Oui oui. Très clair. Sommairement: on stocke jusqu'à plus de bits et on arrondit à la fin. Comment c'est une autre question pour plus tard, je finirai sans doute par le voir.

Euh.. en revanche dans ton exemple, pour moi l'exposant c'est -1 ou alors y quelque chose qui m'échappe...

Merci beaucoup en tout cas.
0
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 657
16 nov. 2009 à 00:01
oui pour l'exposant, désolé, j'ai édité ;)
pour l'arrondi ça impliquerait en effet de faire le calcul jusqu'à une décimale plus loin. si c'est un 1 ->tu augmentes la "vraie" dernière décimal de 1, sinon tu la laisses. Comme avec les nombre décimaux : si c'est un 5( ou plus...) tu augmentes le chiffres avant, sinon tu laisses.
0
Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 657 > Pacorabanix Messages postés 3245 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013
16 nov. 2009 à 00:04
humm... désolé je dis "décimale" pour l'exemple en binaire, mais ce n'est pas le terme correct évidemment ^^

Bonne nuit
0
badcommand Messages postés 84 Date d'inscription mardi 14 avril 2009 Statut Membre Dernière intervention 10 décembre 2010 9
16 nov. 2009 à 00:03
Résolu! Merci.
0