Rechercher : dans
Par :

Calcul binaire

Dernière réponse le 16 nov 2009 à 01:52:45 badcommand, le 15 nov 2009 à 22:31:36 
 Signaler ce message aux modérateurs

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

Configuration: Linux
Firefox 3.5.5

Meilleures réponses pour « Calcul binaire » dans :
[Excel] Chemin et nom de stockage de feuille de calcul VoirIndiquer automatiquement le chemin d'accès (path) et le nom de stockage de toute feuille de calcul Noter dans une cellule (A& par exemple) la formule : =cellule("nomfichier";A1) A chaque sauvegarde et/ou déplacement de fichier dans votre...
Installation / migration Mysql 5.1 avec les binaires officiels VoirPour de multiples raisons, je préfère installer Mysql depuis les binaires compilés par Mysql ,plutôt que d'utiliser les packages (rpm, apt, ...) : les packages installent dans les répertoires de leur choix, il est difficile de maîtriser cela on...
Parser un fichier binaire en PHP VoirSupposons que vous ayez enregistré des données binaires dans un fichier, c'est-à-dire un enregistrement brut qui n'est pas traduit en texte. C'est une chose que l'on fait couramment avec certains langages de bas niveau comme le C ou le...
Télécharger Binary Clock Screensaver VoirLe langage binaire est encore mal connu de tous. Cet éditeur a trouvé le moyen d'allier ce langage avec un écran de veille. Binary Clock Screensaver est un écran de veille basé sur une horloge binaire. L'interface repose sur un fond noir et des leds...
Le codage binaire VoirPrésentation du binaire Bit Poids des bits Conversions Octet KiloOctets, MégaOctets Opérations en binaire Addition binaire Multiplication binaire Présentation du binaire Vers la fin des années 30, Claude Shannon démontra qu'à l'aide...
Le contrôle des erreurs VoirLe contrôle d'erreurs Le codage binaire est très pratique pour une utilisation dans des appareils électroniques tels qu'un ordinateur, dans lesquels l'information peut être codée grâce à la présence ou non d'un signal électrique. Cependant le...

1

badcommand, le 15 nov 2009 à 23:25:52

Up! Merci

Répondre à badcommand

2

Pacorabanix, le 15 nov 2009 à 23:34:42

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).

Répondre à Pacorabanix

3

badcommand, le 15 nov 2009 à 23:40:36

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 ?

Répondre à badcommand

4

loupius, le 15 nov 2009 à 23:43:42

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.

Répondre à loupius

6

badcommand, le 15 nov 2009 à 23:49:48

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

Répondre à badcommand

7

Pacorabanix, le 15 nov 2009 à 23:56:45

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)

Répondre à Pacorabanix

5

Pacorabanix, le 15 nov 2009 à 23:48:25

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...

Répondre à Pacorabanix

12

loupius, le 16 nov 2009 à 00:09:14

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.

Répondre à loupius

13

Pacorabanix, le 16 nov 2009 à 01:09:40

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

Répondre à Pacorabanix

14

 loupius, le 16 nov 2009 à 01:52:45

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.

Répondre à loupius

8

badcommand, le 16 nov 2009 à 00:01: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.

Répondre à badcommand

9

Pacorabanix, le 16 nov 2009 à 00:01:56

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.

Répondre à Pacorabanix

11

Pacorabanix, le 16 nov 2009 à 00:04:37

Humm... désolé je dis "décimale" pour l'exemple en binaire, mais ce n'est pas le terme correct évidemment ^^

Bonne nuit

Répondre à Pacorabanix

10

badcommand, le 16 nov 2009 à 00:03:37

Résolu! Merci.

Répondre à badcommand
Collection CommentÇaMarche.net