5 votes

La précision de la bibliothèque Decimal en python

Depuis la page de documentation de Décimal Je pensais qu'une fois que l'on utilisait des décimales pour calculer, le résultat serait correct et sans erreur flottante.

Mais quand j'essaie cette équation

from decimal import Decimal, getcontext
getcontext().prec = 250

a = Decimal('6')
b = Decimal('500000')

b = a ** b
print('prec: ' + str(getcontext().prec) + ', ', end='')
print(b.ln() / a.ln())

Cela me donne un résultat différent !

enter image description here

Je veux calculer le chiffre de 6**500000 en représentation en base 6, donc le résultat attendu serait int(b.ln() / a.ln()) + 1 qui devrait être 500001. Cependant, lorsque je fixe le préc à 250, le résultat obtenu est erroné. Comment puis-je résoudre ce problème ?

De même, si je veux sortir le résultat sans la notation scientifique (c'est à dire 5E+5 ), que dois-je faire ?

2voto

ti7 Points 1865

Si vous êtes à la recherche de maths très précises ou symboliques et/ou si vous êtes mordu par l'aliasing des flottants IEEE 754, consultez SymPy.

>>> from sympy import log, N
>>> expr = log(6**50000) / log(6)
>>> N(expr)
50000.0000000000

2voto

Mehmaam Points 382

La documentation montre clairement les paramètres de getcontext()

enter image description here

lorsque vous exécutez simplement getcontext() il peut montrer ses paramètres intégrés.

Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])

Quand vous pouvez changer getcontext().prec = 250 alors il ne peut qu'écraser prec valeur.

enter image description here

la principale chose qui peut affecter le résultat est rounding parameter right after the prec C'est un paramètre intégré rounding=ROUND_HALF_EVEN . Je veux changer cela en None mais il peut afficher une erreur.

enter image description here

donc il peut être clair que peu importe ce que nous pouvons faire, cela doit changer même légèrement à cause de rounding paramètre.

Remarque : votre résultat peut également varier en fonction d'autres paramètres intégrés.

1voto

dranjohn Points 625

La documentation pour Decimal.ln() États :

Renvoie le logarithme naturel (base e) de l'opérande. Le résultat est correctement arrondi en utilisant le mode d'arrondi ROUND_HALF_EVEN.

Lorsque vous modifiez la précision, davantage de chiffres sont calculés et ils sont ensuite arrondis vers le bas au lieu du haut. Le nombre doit être arrondi car il n'est pas nécessairement dans la précision spécifiée, ni même rationnel du tout.

Pour l'affichage des résultats en notation scientifique, voir cette question .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X