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.
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.