2009-11-12 6 views

Respuesta

9

Python tiene una biblioteca incorporada para cálculos de precisión arbitraria: decimal. Por ejemplo:

>>>from decimal import Decimal, getcontext 
>>>getcontext().prec = 50 
>>>x = Decimal(1)/Decimal(7) 
>>>x 
Decimal('0.14285714285714285714285714285714285714285714285714') 
>>>str(x) 
'0.14285714285714285714285714285714285714285714285714' 

Mira el Python Decimal documentation para más detalles. Puede cambiar la precisión para que sea tan alta como lo necesite.

+0

Gracias. No sabía sobre el módulo decimal. Esta es la manera más fácil. – grokus

6

Puede multiplicar el numerador por un gran número de^^ y seguir con números enteros de precisión arbitraria.

EDITAR

quiero decir:

> def digits(a,b,n=50): return a*10**n/b 
. 
> digits(1,7) 
14285714285714285714285714285714285714285714285714L 

enteros de Python son de precisión arbitraria. Los flotantes de Python nunca son de precisión arbitraria. (Habría que utilizar decimal, como otra respuesta ha señalado)

3

Utilizando Perl (porque no puedo escribir 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 

Como se puede comprobar con la mano , los dígitos se repiten. Imprimir utilizando "%.50f" le dará la ilusión de mayor precisión.

+0

De hecho, todos los números racionales eventualmente se repiten. –

+0

Este método simple realmente funciona. Lo convertiré a Python y lo usaré. Gracias. – grokus

+0

@Sinan, sé que los dígitos se repiten, pero para detectar patrones repetitivos en otros números racionales (1/d donde d <1000), necesito más precisión. – grokus

2

Con gmpy:

>>> import gmpy 
>>> thefraction = gmpy.mpq(1, 7) 
>>> hiprecfloat = gmpy.mpf(thefraction, 256) 
>>> hiprecfloat.digits(10, 50, -10, 10) 
'0.14285714285714285714285714285714285714285714285714' 
>>> 

No puede hacerlo con flotadores normales - que simplemente no tienen suficiente precisión para 50 dígitos! Imagino que hay una forma de hacerlo (en 2.6 o mejor) con fractions.Fraction, pero no estoy familiarizado con ninguna forma de formatearlo de otra forma que no sea '1/7' (¡no es muy útil en su caso! -).

Cuestiones relacionadas