Calcul décimaux avec norme IEEE 754/854 en Python


Peut-on faire titre plus chiant que celui-là, je vous le demande ?

Toujours est-il que cet article n’interessera que des gens parfaitement chiants, à savoir des scientifiques tatillons, mais je sais qu’il y en a dans notre lectorat alors on va leur jeter un os.

Bref, vous savez que la division par zéro en Python, ça lève une exception :

>>>  1 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-1-b710d87c980c> in <module>()
----> 1 1 / 0
 
ZeroDivisionError: integer division or modulo by zero

Certains esprits chagrins n’aiment pas ce comportement, et voudraient, par exemple, que cela retourne l’infini. Après tout, pourquoi pas.

N’y a-t-il rien qu’on puisse faire pour calmer la rétention anale qui se prépare à cette déconvenue ?

Bien sûr que si, on parle de Python voyons !

>>> from decimal import setcontext,ExtendedContext, Decimal 
>>> setcontext(ExtendedContext)
 
>>> 1 / Decimal(0)
Infinity
>>> -1 / Decimal(0)
-Infinity

Voilà. Si vous êtes une personne normale et manipulez des objets concrets comme des sous, des joujoux, des choux non additionnés avec des carottes ou des hashtags, les réglages par défaut sont parfaits. Mais si vous êtes un fan de scipy, traitant des matrices par bottes de douze, ça peut servir.

Spéciale dédicace à mes amis au CNRS. Bisoux partout !

7 thoughts on “Calcul décimaux avec norme IEEE 754/854 en Python

  • François

    Et la soustraction des deux infinis donne un NaN :)

    Et l’inverse de l’infini donne ce joli zéro :

    In [16]: 1 / (1 / Decimal(0))
    Out[16]: Decimal('0E-1000007')

  • Pour du beurre

    Notre monde étant fini, l’infini n’a aucun intérêt en calcul scientifique. C’est un concept de mathématicien.

  • Glandos

    C’est surtout que l’infini, pour les physiciens, c’est souvent juste les valeurs normales fois 100 ou 1000.

  • Erik

    Peut-on faire titre plus chiant que celui-là, je vous le demande ?

    Un petit sujet sur les numéros de semaine en norme ISO 8601 ? Et calcul inverse depuis le numéro de semaine vers la date du lundi correspondant ?

  • kontre

    @Pour du beurre: C’est plutôt que si un calcul donne l’infini, c’est qu’il y a un gros souci dans le programme quelque part !

    Bizarre que 1 / (1 / Decimal(0)) ne donne pas 0 pile poil, quand même (ouais, je sais, c’est pas loin…)

    Au passage, numpy utilise ça aussi :

    from numpy import np
    a = np.zeros(1) # array([ 0.])
    1/a # array([ inf])

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.