2017-06-06 2 views
0

Comme Python n'a pas de limite sur les entiers mais a une certaine limite sur ses flottants. Comment calculer le plancher de très gros flotteurs? J'essaie de calculer floor (A * B), où A est un petit nombre irrationnel, éventuellement sqrt (2), e, sqrt (5) etc et B est un très grand nombre dans la gamme 10^1000.Plancher de très grands flottants en python

Répondre

1

Vous pouvez utiliser le module decimal:

>>> from decimal import Decimal 
>>> from math import floor, sqrt 
>>> 
>>> d1 = Decimal(sqrt(2)) 
>>> d2 = Decimal(10**1000) 
>>> 
>>> result = d1 * d2 
>>> floor(result) 

Vous pouvez également définir la précision de la décimale à l'aide getcontext().prec afin d'obtenir un résultat plus précis.

>>> from decimal import * 
>>> getcontext().prec = 100 
>>> d1 = Decimal(2).sqrt() 
>>> d1 
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573') 
+0

Pourquoi avez-vous fait DECIMAL (str ()) 'plutôt que DECIMAL ()' –

+2

Si le défi est de calculer la valeur exacte de 'étage (A * B)', puis cette réponse ne le résout pas, car la précision est perdue lors de l'étape 'sqrt (2)' et n'est pas restaurée par la suite. – Leon

+0

Merci @Leon et @ Andrew Gelnar pour vos commentaires, le code mis à jour. – JkShaw

0

Les flottants de 64 bits ne dépassent pas ~ 10^308. Donc, votre 10^1000 ne va certainement pas s'adapter, indépendamment de la multiplication par une constante. (Aucun flottant de 64 bits peut être assez petit pour rendre 10^1000 moins de 10^308.) Donc votre procédure ne fonctionnera pas pour les flottants.

Envisagez d'utiliser le module decimal. Par exemple:

import decimal 
import math 
a = decimal.Decimal("10") ** 10000 
b = decimal.Decimal("0.123") 
math.floor(a*b)