Pregunta

Estoy tratando de expandir la función Exp (x) a la serie Taylor. Aquí está el código:

double CalcExp(){
double eps = 0.0000000000000000001;
double elem = 1.0;
double sum = 0.0;
int i = 1;
sum = 0.0;
do {
    sum += elem;
    elem *= x / i;
    i++;
} while (elem >= eps);
return sum;

}

El problema es cuando ingreso a Big X o Negation X, mi programa se bloquea. Y cuando ingreso x como "0.00000000001", el resultado es -1.

Necesitar consejo. Gracias por la ayuda.

¿Fue útil?

Solución

Para valores X grandes (alrededor de 700 y más), alcanzará el límite de rango para dobles (10^308) y causará un bucle infinito. No puede hacer mucho al respecto, debe limitar el rango de entrada X o usar una biblioteca de números grandes para tener un rango extendido.

Otra solución es agregar esto a su bucle:

if (sum > 1E305) {
  // we'll most likely run into an infinite loop
  break;
}

Tenga en cuenta que debe manejar este caso fuera del bucle después para evitar imprimir un resultado incorrecto muy grande.

No puedo reproducir el problema para 0.00000000001, esto solo devuelve 1 para mí. Los valores negativos también funcionan bien, aunque el resultado es incorrecto, lo que parece ser un error/limitación en el algoritmo. Editar: para corregir esto, podemos usar el hecho de que e^-x es lo mismo que 1 / e^x.

Código:

#include <stdio.h>

double CalcExp(double x){
  double eps = 0.0000000000000000001;
  double elem = 1.0;
  double sum = 0.0;
  bool negative = false;
  int i = 1;
  sum = 0.0;
  if (x < 0) {
    negative = true;
    x = -x;
  }
  do {
    sum += elem;
    elem *= x / i;
    i++;
    if (sum > 1E305) break;
  } while (elem >= eps);
  if (sum > 1E305) {
    // TODO: Handle large input case here
  }

  if (negative) {
    return 1.0 / sum;
  } else {
    return sum;
  }
}

int main() {
  printf("%e\n", CalcExp(0.00000000001)); // Output: 1.000000e+000
  printf("%e\n", CalcExp(-4));            // Output: 1.831564e-002
  printf("%e\n", CalcExp(-45));           // Output: 2.862519e-020
  printf("%e\n", CalcExp(1));             // Output: 2.718282e+000
  printf("%e\n", CalcExp(750));           // Output: 1.375604e+305
  printf("%e\n", CalcExp(7500000));       // Output: 1.058503e+305
  printf("%e\n", CalcExp(-450000));       // Output: 9.241336e-308
  return 0;
}

Otros consejos

Necesitar consejo.

Intente pasar su programa en un depurador para ver a dónde va mal. Si no tiene un depurador, inserte declaraciones de impresión dentro del bucle para monitorear los valores de las variables que cambian.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top