2012-05-23 28 views
14

yo estaba muy decepcionado cuando decimal.Decimal(math.sqrt(2)) produjoprecisión arbitraria de raíces cuadradas

Decimal('1.4142135623730951454746218587388284504413604736328125') 

y los dígitos después del punto decimal 15a resultó equivocada. (A pesar feliz que le da mucho más de 15 dígitos!)

¿Cómo puedo obtener los primeros mcorrectas dígitos en la expansión decimal de sqrt(n) en Python?

+6

'math.sqrt()' funciona en float. ¿Por qué esperarías algo más que lo que obtuviste? Necesitas una gran libación flotante. Use websearch para encontrar uno. –

+8

¿Por qué no probar Decimal (2) .sqrt() en su lugar? –

Respuesta

42

Utilice el método sqrt en decimal

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

+1 para mostrar cómo cambiar la precisión. Estoy borrando mi propia respuesta a favor de esta. –

+0

Creo que nuestras respuestas deben haberse cruzado en el mensaje mientras estaba 'pydoc'ing cómo establecer la precisión ;-) –

+0

+1 - una respuesta agradable, sucinta y precisa. – duffymo

4

Los números de coma flotante de doble precisión estándar IEEE solo tienen 16 dígitos de precisión. Cualquier software/hardware que utiliza IEEE no puede hacerlo mejor:

http://en.wikipedia.org/wiki/IEEE_754-2008

que había necesidad de una implementación de la clase BigDecimal especial, con todas las funciones matemáticas aplicadas para usarlo. Java tiene tal cosa. Python también lo hace:

http://en.literateprograms.org/Arbitrary-precision_elementary_mathematical_functions_%28Python%29

5

Usted puede intentar bigfloat. Ejemplo de la página del proyecto:

from bigfloat import * 
sqrt(2, precision(100)) # compute sqrt(2) with 100 bits of precision 
+5

Gah. Odio esa biblioteca. :-) –

+1

@MarkDickinson ¿Por qué? me parece bien. – wong2

+7

@ wong2: Creo que te perdiste el emoticón. Mark Dickinson es el autor de bigfloat. –

0

¿Cómo puedo obtener los dígitos correctos primera m en la expansión decimal de sqrt (n) en Python?

Una manera es calcular integer square root del número multiplicado por la potencia requerida de 10. Por ejemplo, para ver los primeros 20 lugares decimales de sqrt(2), puede hacerlo:

>>> from gmpy2 import isqrt 
>>> num = 2 
>>> prec = 20 
>>> isqrt(num * 10**(2*prec))) 
mpz(141421356237309504880) 

La función es isqrt de hecho, es bastante fácil de implementar usando el algoritmo provisto en la página de Wikipedia.

+2

Esto es más o menos lo que el módulo 'decimal' está haciendo para calcular' Decimal (2) .sqrt() '. :-) –

+0

@Mark: es bueno saberlo. Aunque, la última vez que lo probé, fue mucho más lento que hacer esto "manualmente". –

+0

Sí, el módulo decimal Python 2 era Python puro, y nunca se ha conocido por su velocidad. Debería ser un poco mejor en Python 3 (o usar el backport PyPI 'cdecimal' para Python 2). –

Cuestiones relacionadas