raices - raiz cuadrada en python numpy
Precisión arbitraria de raíces cuadradas. (4)
¿Cómo puedo obtener los primeros m dígitos correctos en la expansión decimal de sqrt (n) en Python?
Una forma es calcular la raíz cuadrada entera del número multiplicado por la potencia requerida de 10. Por ejemplo, para ver los primeros 20 lugares decimales de sqrt(2)
, puede hacer:
>>> from gmpy2 import isqrt
>>> num = 2
>>> prec = 20
>>> isqrt(num * 10**(2*prec)))
mpz(141421356237309504880)
La función isqrt
es bastante fácil de implementar utilizando el algoritmo proporcionado en la página de Wikipedia.
Me decepcionó bastante cuando el decimal.Decimal(math.sqrt(2))
dio como resultado
Decimal(''1.4142135623730951454746218587388284504413604736328125'')
y los dígitos después del décimo quinto lugar decimal salieron mal. (¡A pesar de darte alegremente mucho más de 15 dígitos!)
¿Cómo puedo obtener los primeros m
dígitos correctos en la expansión decimal de sqrt(n)
en Python?
Los números de punto flotante de precisión doble IEEE estándar solo tienen 16 dígitos de precisión. Cualquier software / hardware que use IEEE no puede hacerlo mejor:
http://en.wikipedia.org/wiki/IEEE_754-2008
Necesitaría una implementación de clase BigDecimal especial, con todas las funciones matemáticas implementadas para usarla. Java tiene tal cosa. Python también lo hace:
http://en.literateprograms.org/Arbitrary-precision_elementary_mathematical_functions_%28Python%29
Puedes probar bigfloat . Ejemplo de la página del proyecto:
from bigfloat import *
sqrt(2, precision(100)) # compute sqrt(2) with 100 bits of precision
Utilice el método sqrt
en decimal
>>> from decimal import *
>>> getcontext().prec = 100
>>> Decimal(2).sqrt()
Decimal(''1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573'')
>>>