• [^] # Re: Rien de surprenant

    Posté par (site web personnel) . En réponse au journal [Humour] vers un monde différent. Évalué à 6.

    Tu découvres simplement que les nombres décimaux non entiers ne sont pas représentables nativement par un ordinateur de manière exact.

    Ce n'est pas tout à fait vrai. Je me place, pour simplifier les écritures, dans le cas où on travaille sur un processeur 64 bits. La norme de représentation IEEE754 stipule que les "rationnels binaires" sont exactement représentables en machine. Il s'agit des rationnels de la forme k2^{-52} où k\in\left\{0,\dots,2^{52}-1\right\} (k désigne ce qu'on appelle la mantisse du nombre). Je ne mentionne pas la partie "exposant" du flottant qui permet essentiellement d'atteindre des rationnels de la forme précédente multipliés par des puissances positives ou négatives de 2 (histoire de se "rapprocher" de 0 ou de +\infty) et je ne parle pas du bit de signe non plus (qui permet d'aller titiller les négatifs).

    Les calculs qui sont faits avec ces rationnels binaires sont parfaitement exacts tant que les tailles des résultats restent dans les plages de représentation imposées par la norme.

    Tout rationnel binaire est un décimal mais la réciproque est fausse.

    En gros un nombre de la forme 0,375 (qui vaut 1/8, c'est à dire 3\times 2^{49}\times 2^{-52}) est un rationnel binaire, donc est représentable sur 64 bits sans aucune approximation. En mémoire, les 52 derniers bits de mantisse (occupant 6,5 octets) seraient
    110000000000000000000000000000000000000000000000000000
    Pour illustrer, en python, si tu calcules: 0.25 - 0.375 + 0.125 alors il sort bien 0.0.

    A contrario, un nombre comme 0,2 (qui vaut 1/5) ne l'est pas (car c'est un décimal non rationnel binaire). Il sera stocké avec une mantisse de la forme k2^{-52} avec k arrondi (en fonction des options données au FPU) à l'entier le plus près, ou inférieur, ou supérieur.

    C, C++, Pascal, Ada, Python ou autres utilisent la norme IEEE754 pour manipuler des flottants et font tous une approximation au rationnel binaire le plus proche avant de procéder aux opérations. On peut utiliser des librairies qui augmentent le nombre de chiffres de la mantisse et donnent l'illusion d'une précision infinie, ce qui est évidemment totalement faux. Par exemple, même avec des bibliothèques spécialisées comme GMP pour faire de l'arithmétique multiprécision, la valeur de l'entier 10^{10^{90}} n'est pas représentable en machine (car le nombre de chiffres à afficher (à savoir 1+ 10^{90}) dépasse le nombre d'atomes dans l'univers visibles !!!).