Python vs Calculatrice

Bonjour,

Le calcul suivant sur Python 0.3 - 0.1 - 0.2 me renvoie -2.7755575615628914e-17et non pas 0.
Je sais qu'il s'agit d'un problème de représentation des nombres à virgule car Python compte en base 2.

En revanche, je me demandais pourquoi ce problème n’apparaissait pas sur ma calculatrice scientifique (ou n'importe quelle calculatrice d'ailleurs) ?
Une calculatrice fait elle ses calculs en base différente de 2 ?
Si il s'agit d'un simple problème d'arrondi, pourquoi Python n'en fait il pas de même que que ma calculatrice, car celle-ci bien que moins performante que Python m'a quand même rendu un résultat juste.
Peut-on dire que ma calculatrice est plus performante que Python ?

Merci

Réponses

  • Quel calcul suivant ?
  • Je crois que souvent, les calculatrices représentent les nombres en "décimal codé binaire" ce qui évite les problèmes de représentation : DCB
  • Ta calculatrice est plus performante que Python si tu veux calculer 0.3-0.1-0.2 mais moins que Python si tu veux calculer 21000.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34) 
    [GCC 7.3.0] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 3/10-1/10-2/10
    0
    
  • Pas en Python 3 :
    >>> 3/10-1/10-2/10
    -2.7755575615628914e-17
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • @GaBuZoMeu : Python2 donne la bonne réponse mais c'est quand même une erreur.
    Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
    [GCC 5.4.0 20160609] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 3/10-1/10-2/10
    0
    >>> 3/10
    0
    >>> 1/10
    0
    >>> 2/10
    0
    
    PS
    Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
    [GCC 5.4.0 20160609] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> .3-.1-.2
    -2.7755575615628914e-17
    
  • Mon exemple était mal choisi, parce que la barre de fraction est la division entière (sans reste) en python 2. Si on veut un calcul exact en python
    >>> from fractions import *
    >>> Fraction(3,10)-Fraction(1,10)-Fraction(2,10)
    Fraction(0, 1)
    
    Moi je trouve plutôt ça bien de pouvoir faire la différence entre calcul en flottants et calcul exact en rationnels.
    En Sage :80458
  • Ça ne répond pas à la question mais on peut aussi faire le calcul avec le module decimal :

    from decimal import Decimal
    
    print(Decimal("0.3")-Decimal("0.2")-Decimal("0.1"))
    print(0.3-0.2-0.1)
    

    qui affiche
    0.0
    -2.77555756156e-17
    
  • Merci pour vos réponses :)
    Je pense comme l'a dit Skilveg que la réponse se trouve du côté du DCB "Décimal Codé Binaire"
  • Peut-être cette page de blog apporte-t-elle des infos complémentaires :

    Decimal Floating Point in Scientific Calculators
Connectez-vous ou Inscrivez-vous pour répondre.