Euler # 26, comment convertir un nombre rationnel de chaîne avec une meilleure précision?
-
19-09-2019 - |
Question
Je veux 1/7
avec une meilleure précision, mais il m'a tronqué. Comment puis-je obtenir une meilleure précision quand je convertir un nombre rationnel?
>>> str(1.0/7)[:50]
'0.142857142857'
La solution
Python dispose d'une bibliothèque intégrée pour les calculs de précision arbitraire: décimal. Par exemple:
>>>from decimal import Decimal, getcontext
>>>getcontext().prec = 50
>>>x = Decimal(1)/Decimal(7)
>>>x
Decimal('0.14285714285714285714285714285714285714285714285714')
>>>str(x)
'0.14285714285714285714285714285714285714285714285714'
Regardez le documentation Python décimal pour plus de détails. Vous pouvez modifier la précision d'être aussi haut que vous avez besoin.
Autres conseils
Vous pouvez multiplier le numérateur par un grand 10 ^ N et le bâton avec des entiers de précision arbitraire.
modifier
Je veux dire:
> def digits(a,b,n=50): return a*10**n/b
.
> digits(1,7)
14285714285714285714285714285714285714285714285714L
Les entiers de Python sont une précision arbitraire. Les flotteurs de Python ne sont jamais précision arbitraire. (Vous auriez à utiliser décimal, comme une autre réponse a souligné)
L'utilisation de Perl (parce que je ne peux pas écrire Python; -):
use strict; use warnings;
use integer;
my $x = 1;
my $y = 7;
for (1 .. 50) {
$x *= 10 if $x < $y;
my $q = $x / $y;
$x -= $q * $y;
print $q;
}
print "\n";
14285714285714285714285714285714285714285714285714
Comme vous pouvez le vérifier à la main, la répétition des chiffres. Impression à l'aide "%.50f"
vous donnera la illusion de plus de précision.
gmpy :
>>> import gmpy
>>> thefraction = gmpy.mpq(1, 7)
>>> hiprecfloat = gmpy.mpf(thefraction, 256)
>>> hiprecfloat.digits(10, 50, -10, 10)
'0.14285714285714285714285714285714285714285714285714'
>>>
Vous ne pouvez pas le faire avec des flotteurs normaux - ils n'ont tout simplement pas assez de précision pour 50 chiffres! J'imagine qu'il ya une façon de le faire (en 2.6 ou mieux) avec fractions.Fraction
, mais je ne suis pas au courant de toute façon de le formater autrement que comme '1/7'
(pas très utile dans votre cas -).