18 votos

Cómo calcular el seno de un gran número

Durante varios días, me he estado preguntando cómo sería posible calcular el seno de los grandes números como 100000! (radianes). Yo, obviamente, no uso double pero cpp_rational de este aumento multiprecision de la biblioteca. Pero simplemente no me puedo hacer 100000! mod 2pi y, a continuación, utilizar la función integrada sinl (no necesito más de 10 dígitos decimales..) como que iba a necesitar varios millones de dígitos de pi para calcular esto con exactitud.

Hay alguna forma de lograr esto?

15voto

casperOne Puntos 49736

Yo creo que usted puede ser capaz de calcular esto sin obsceno números de dígitos de $\pi$ si usted toma ventaja del hecho de que estos son factoriales. Para simplificar el álgebra, podemos calcular el $a_n=e^{i(n!)}$ (desea que la parte imaginaria). Entonces $$a_{n+1}=e^{i(n!)(n+1)}=a_n^{n+1},$$ and it's perfectly reasonable to calculate $a_{100000}$ recursively with a high-precision library.

The downside is that to start the recursion you need a very good approximation of $e^i$, and I don't know if the error dependence works out any differently than in the $\pmod{2\pi}$ approach.

But to answer your actual question, Mathematica doesn't even break a sweat with the mere million digits needed for this:

> Block[{$MaxExtraPrecision = 1000000}, N[Sin[100000!], 10]]

-0.9282669319

takes about 15 ms on my computer.


For calculating the sine or cosine of a large arbitrary precision real number $x$, the gains of this method (which are tuned for $\pecado, n$ for integer $n$) are mostly lost, so I would recommend your original idea of reducing the argument $\bmod 2\pi$. As has been noted, the main bottleneck is a high-precision estimation of $\pi$. Your answer will be useless unless you can at least calculate $\frac{x}{\pi}$ to within $1$ (otherwise you may as well answer "somewhere between $-1$ and $1$"), so you need at least $\log_2(x/\pi^2)$ bits of precision for $\pi$. With $x\approx100000!$, that's about $1516701$ bits or $456572$ digits. Add to this the number $a$ of bits of precision you want in the result, so about $1516734$ digits of $\pi$ to calculate $33$ bits ($\aproximadamente un 10$ digits) of $\sin x$ in the range $x\aprox 100000!$.

Once you have an integer $n$ such that $y=2\pi n$ is close to $x$ (ideally $|x-2\pi n|\le2\pi$, it doesn't have to be perfectly rounded), calculate $\pi$ to precision $+\log_2(n)$, so that $s$ is known to precision $$, and then $x-y$ is precision $$ and $\sen x=\sin (x-y)$ can be calculated to precision $$ así.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X