tutorial simples resueltos respuestas respuesta para niños mentales matematicos logica español dificiles cortos con acertijos c++ math exponential

c++ - simples - acertijos mentales de logica



Cálculo de e ^ x sin usar ninguna función (4)

¡Ambos x ^ n y n! crecer rápidamente con n (exponencial y superexponencial respectivamente) y pronto se desbordará cualquier tipo de datos que utilice. Por otro lado, x ^ n / n! baja (eventualmente) y puedes detenerlo cuando es pequeño. Es decir, use el hecho de que x ^ (n + 1) / (n + 1)! = (x ^ n / n!) * (x / (n + 1)). De esta manera, diga:

term = 1.0; for(n=1; term >= 1.0E-10; n++) { eValue += term; term = term * x / n; }

(Código escrito directamente en esta casilla, pero espero que funcione).

Editar: Tenga en cuenta que el término x ^ n / n! es, para x grande, aumentando por un tiempo y luego disminuyendo. Para x = 709, sube a ~ 1e + 306 antes de disminuir a 0, que está justo en los límites de lo que puede manejar el double (el double es ~ 1e308 y el term*x empuja), pero el long double funciona mucho multa. Por supuesto, su resultado final e x es mayor que cualquiera de los términos, por lo que, suponiendo que esté utilizando un tipo de datos lo suficientemente grande como para acomodar el resultado, todo irá bien.

(Para x = 709, puede usar simplemente el double si usa term = term / n * x , pero no funciona para 710).

Se supone que calculamos e ^ x usando este tipo de fórmula:

e ^ x = 1 + (x ^ 1/1!) + (x ^ 2/2!) ......

Tengo este código hasta ahora:

while (result >= 1.0E-20 ) { power = power * input; factorial = factorial * counter; result = power / factorial; eValue += result; counter++; iterations++; }

Mi problema ahora es que dado que factorial es de tipo largo, ¡realmente no puedo almacenar un número mayor que 20! entonces, lo que sucede es que el programa genera números divertidos cuando llega a ese punto ...

La solución correcta puede tener un valor X de como máximo 709, por lo que e ^ 709 debería dar salida: 8.21840746155e + 307

El programa está escrito en C ++.


¿Qué sucede si cambia el tipo de factorial de long long a double ?


Lo que presenta aquí es una aplicación del esquema de Horner para calcular polinomios.


Puedo pensar en otra solución. Deje pow(e,x) = pow(10, m) * b donde b es >=1 y < 10 , luego

m = trunc( x * log10(e) )

donde en log10(e) es un factor constante.

y

b = pow(e,x)/pow(10, m ) = pow(e,x)/pow(e,m/log10(e)) = pow (e,x-m/log10(e))

Por esto obtienes:

z = x-m/log10(e)

que estará entre 0 y 3 y luego usar b = pow(e,z) según lo dado por SreevartsR.

y la respuesta final es

b es base (dígito significativo) ym es mantissa (orden de magnitud).

esto será más rápido que el enfoque SreevartsR y es posible que no necesite usar altas precisiones.

La mejor de las suertes.

Esto incluso funcionará para cuando x es menor que 0 y un negativo mayor, en ese caso z estará entre 0 y -3 y esto será más rápido que cualquier otro enfoque.

Como z es -3 a 3, y si necesita los primeros 20 dígitos significativos, ¡la expresión de pow (e, z) puede evaluarse hasta 37 términos solo desde 3 ^ 37/37! = ~ 3.2e-26.