3 votos

Calcular una gran exp(x) de forma numéricamente robusta.

Estoy tratando de calcular $\lfloor e^x \rfloor$ donde x es un entero de 64 bits. El problema es que el resultado del cálculo puede ser cercano a 2^64 . En este rango, los números en coma flotante de 64 bits serán más escasos que los enteros de 64 bits, por lo que sería una mala idea utilizar algo como el exp función de biblioteca en C que devuelve un double . En su lugar, me gustaría utilizar un método que calcule directamente el resultado entero de 64 bits.

¿Existe una fórmula o un algoritmo bien condicionado para calcular este valor mínimo como un entero, sin perder precisión al pasar por punto flotante?

4voto

Mike Puntos 1113

La forma más fácil de hacer esto es simplemente configurar su sistema de CA favorito (por ejemplo, Wolfram Alpha) para calcular el valor preciso de $e^x$ para el $\approx 40$ valores de $x$ s.t. $e^x\lt 2^{64}$ y almacenar los resultados en una tabla que está codificada en su aplicación.

2voto

Jukka Dahlbom Puntos 1219

Lo primero que se me ocurre:

Utilizar la representación en serie $e^x = \sum_{i=1}^\infty \frac{x^n}{n!}$ . Porque $21!>2^{64}$ , calculando

Tras un examen más exhaustivo, parece que para que $$ \left\lfloor e^x \right\rfloor = \left\lfloor \sum_{n=0}^{n} \frac{x^n}{n!} \right\rfloor $$ para producir un valor exacto, necesitamos $n = O(x)$ . Es decir, cuanto más alto $x$ es, más términos necesitamos, por lo que $n \geq 106$ se necesitaría para una precisión de hasta $x = 40$ . Esto no es tan útil como había supuesto.

1voto

heropup Puntos 29437
Table[Floor[Exp[k]], {k, 0, 44}]

da

$$\{1,2,7,20,54,148,403,1096,2980,8103,22026,59874,162754,442413,1202604,3269017,8886110,24154952,65659969,178482300,485165195,1318815734,3584912846,9744803446,26489122129, 72004899337,195729609428,532048240601,1446257064291,3931334297144,10686474581524,29048849665247,78962960182680,214643579785916,583461742527454,1586013452313430,4311231 547115195,11719142372802611,31855931757113756,86593400423993746,235385266837019985,639843493530054949,1739274941520501047,4727839468229346561,12851600114359308275\}$$

0voto

vonbrand Puntos 15673

Tal vez algún tipo de Algoritmo CORDIC es la mejor opción. El cálculo de enormes factoriales y fracciones con la precisión necesaria será doloroso.

Si el rendimiento no es tan crítico, y el tiempo del programador es costoso, tal vez el uso de una biblioteca de punto flotante de alta precisión, como MPFR es la mejor apuesta.

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