Frage

Ich versuche, Exp (x) -Funktion auf die Taylor -Serie zu erweitern. Hier ist Code:

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;

}

Das Problem ist, wenn ich Big X oder Negative X eingreife. Mein Programm stürzt ab. Und wenn ich X wie "0.00000000001" eingehe, beträgt das Ergebnis -1.

Brauchen Rat. Danke für die Hilfe.

War es hilfreich?

Lösung

Für große X -Werte (ca. 700 und höher) werden Sie die Reichweite für Doppel (10^308) erreichen und eine unendliche Schleife verursachen. Sie können nicht viel dagegen tun, Sie sollten entweder den X -Eingangsbereich einschränken oder eine große Zahlbibliothek verwenden, um einen erweiterten Bereich zu erhalten.

Eine weitere Problemumgehung besteht darin, dies zu Ihrer Schleife hinzuzufügen:

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

Beachten Sie, dass Sie diesen Fall anschließend außerhalb der Schleife bewältigen sollten, um ein sehr großes falsches Ergebnis zu drucken.

Ich kann das Problem nicht reproduzieren 0.00000000001, Das gibt das nur 1 für mich zurück. Auch negative Werte laufen gut, obwohl das Ergebnis falsch ist, was ein Fehler/eine Einschränkung im Algorithmus zu sein scheint. Bearbeiten: Um dies zu korrigieren, können wir die Tatsache verwenden, dass e^-x ist das gleiche wie 1 / e^x.

Code:

#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;
}

Andere Tipps

Brauchen Rat.

Versuchen Sie, Ihr Programm in einem Debugger durchzusetzen, um zu sehen, wo es schief geht. Wenn Sie keinen Debugger haben, fügen Sie Druckanweisungen in die Schleife ein, um die Werte von Variablen zu überwachen, die sich ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top