Python: Calcule el seno / coseno con una precisión de hasta 1 millón de dígitos

La pregunta es bastante autoexplicativa. He visto un par de ejemplos para pi pero no para funciones de trigo. Tal vez uno podría usar una serie de Taylor como se hace aquí, pero no estoy del todo seguro de cómo implementar eso en Python. Especialmente cómo almacenar tantos dígitos. Debo mencionar: esto idealmente se ejecutaría en Python de vainilla, es decir, no numpy, etc.

¡Gracias!

Edición: como he dicho, sé que la pregunta se ha hecho antes, pero está en java y estaba buscando una implementación de python 🙂

Edición 2: wow, no sabía que la gente aquí puede ser tan absorta en sí misma. Intenté varios enfoques pero ninguno funcionaría. Pensé que este es un lugar donde puedes pedir consejo, supongo que estaba equivocado

última edición: para cualquier persona que pueda resultarle útil: muchos angularjs se pueden calcular como un múltiplo de sqrt (2), sqrt (3) y Phi (1.61803 ..) Dado que esos números están ampliamente disponibles con una precisión de hasta 10 dígitos de dígitos, Es útil tenerlos en un archivo y leerlos en su progtwig directamente.

mpmath es el camino

 from mpmath import mp precision = 1000000 mp.dps = precision mp.cos(0.1) 

Si no puede instalar mpmath o cualquier otro módulo, puede probar la aproximación polinómica como se sugiere.

introduzca la descripción de la imagen aquí

donde Rn es el rest de Lagrange

introduzca la descripción de la imagen aquí

Tenga en cuenta que Rn crece rápidamente tan pronto como x se aleja del centro x 0 , así que tenga cuidado al usar la serie Maclaurin (serie de Taylor centrada en 0) al intentar calcular sin (x) o cos (x) de x arbitraria .

Mala idea: el infinito no existe en las computadoras

Mala idea: el infinito no existe en las computadoras

 import math x = .5 def sin(x): sum = 0 for a in range(0,50): #this number (50) to be changed for more accurate results sum+=(math.pow(-1,a))/(math.factorial(2*a+1))*(math.pow(x,2*a+1)) return sum ans = sin(x) print(str.format('{0:.15f}', ans)) #change the 15 for more decimal places 

Este es un ejemplo de la implementación de la serie de Taylor utilizando python como sugirió anteriormente. Cambiar a cos no sería demasiado difícil después de eso.

EDITAR:

Se agregó en el formato de la última línea para imprimir más lugares decimales.

Prueba esto

 import math from decimal import * def sin_taylor(x, decimals): p = 0 getcontext().prec = decimals for n in range(decimals): p += Decimal(((-1)**n)*(x**(2*n+1)))/(Decimal(math.factorial(2*n+1))) return p def cos_taylor(x, decimals): p = 0 getcontext().prec = decimals for n in range(decimals): p += Decimal(((-1)**n)*(x**(2*n)))/(Decimal(math.factorial(2*n))) return p if __name__ == "__main__": ang = 0.1 decimals = 1000000 print 'sin:', sin_taylor(ang, decimals) print 'cos:', cos_taylor(ang, decimals)