Python 0.1+0.2

Bonjour,

est-il utile de faire remarquer à des élèves de seconde le souci soulevé par ce calcul tout simple sur Python ?

on lui tape 0.1+0.2
Il sort : 0.30000000000004
Pas ce souci si on tape 0.1+0.3
> Ecriture en base 2 ....etc....


Y a-t-il un moyen sur Python de corriger ce tir ?

Réponses

  • Oui, avec le module decimal.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • C'est-à-dire c'est une bibliothèque ?
  • Oui (attention à la casse).
    >>> from decimal import Decimal
    >>> Decimal("0.1")+Decimal("0.2")
    Decimal('0.3')
    >>> Decimal(0.1)+Decimal(0.2)
    Decimal('0.3000000000000000166533453694')
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • donc on a le même problème.... ^^
  • Essaie ce pis-aller :
    >>> def d(n):
    ...   return Decimal(str(n))
    ... 
    >>> d(0.1)
    Decimal('0.1')
    >>> d(0.1)+d(0.2)
    Decimal('0.3')
    >>> d(0.1+0.2)
    Decimal('0.30000000000000004')
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Ok merci !
  • merci @paul18 pour ces deux liens instructifs

    mais du coup, ça me refroidit sur mon emballement (récent) pour Python...Python serait donc puissant seulement sur les entiers ?
  • Comme énormément de langages.
    Il existe un module sur les fractions.
    >>> from fractions import Fraction
    >>> Fraction("2/6")
    Fraction(1, 3)
    >>> Fraction("2/6")+Fraction("4/15")
    Fraction(3, 5)
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • ce n'est pas un problème de langage mais bien un problème de codage informatique; le résultat est le même sous Julia et Scilab (double)
    --> a=0.1+0.2
     a  = 
    
       0.3
    
    --> printf("%.20lf\n",a)
    0.30000000000000004000
    
    julia> 0.1+0.2
    0.30000000000000004
    


    Paul
  • Pourquoi la calculatrice ne fait pas ce bug ? Elle est programmée pour faire des arrondis ?
    (désolé si ma question est naïve mais je mets juste le nez dans ces problèmes)
  • Je pense que c'est surtout une politique d'affichage. Sans doute la calculatrice affiche-t-elle moins que ce qui est stocké.
  • En fait non, les constructeurs de calculatrices sont confrontes au probleme depuis longtemps, et certains ont developpe des solutions qui ne sont pas simplement un affichage arrondi. Chez HP, les anciennes 48 et leur famille utilisaient un microprocesseur (Saturn) capable d'additionner/soustraire en BCD (i.e. on utilise un quartet=4 bits pour coder un chiffre de l'ecriture en base 10). Les nouvelles HP ont une librairie pour calculer avec des flottants BCD dans Home (pas dans CAS, ou les flottants sont en base 2 avec troncature a 48 bits de mantisse). Je pense que TI et Casio ont des solutions analogues a HP.
Connectez-vous ou Inscrivez-vous pour répondre.