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
0
A
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
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)
Pourquoi avez-vous fait DECIMAL (str ()) 'plutôt que DECIMAL ()' –
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
Merci @Leon et @ Andrew Gelnar pour vos commentaires, le code mis à jour. – JkShaw