• [^] # Re: Rien de surprenant

    Posté par . En réponse au journal [Humour] vers un monde différent. Évalué à 7.

    Merci de lire le 3e point de la page de la doc de Python. C'est exactement de ça dont je parle, c'est exactement la solution au problème exposé dans ce journal.

    Eh bien ce que tu souhaites exactement (par défaut) est profondément ridicule. Quitte à choisir une représentation pour avoir de l'exactitude dans les calculs et perdre du temps (inutile dans la quasi totalité des applications), autant choisir celles des fractions : avec les décimaux tu n'as même pas la structure de corps (c'est pas « stable » par division comme type de données).

    >>> from decimal import Decimal
    >>> i,j = Decimal(3), Decimal(5)
    >>> i * (j / i)
    Decimal('5.000000000000000000000000001')
    >>> (i * j) / i
    Decimal('5')
    >>> from fractions import Fraction
    >>> i,j = Fraction(3), Fraction(5)
    >>> i * (j / i)
    Fraction(5, 1)
    >>> (i * j) / i
    Fraction(5, 1)

    Maintenant que Python switche tout seul de l'int à l'IEEE quand il le juge bon, va-t-il un jour switcher de int à Decimal à IEEE quand il le juge bon ?

    Et je t'ai répondu que ce n'est pas ce qu'il fait ! Il a juste changer la sémantique de l'opérateur / et son type de sortie. Avant / calculait le quotient euclidien et était de type int * int -> int, maintenant il calcule le résultat de la division en flottant et est de type int * int -> float. C'est juste un changement de sémantique (l'opérateur // étant là pour la division euclidienne) et non une adaptation au besoin de précision. Si vraiment, ils avaient voulu cela (ou s'ils le voulaient) il faudrait choisir le type Fraction en sortie et non le type Decimal.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.