質問
Exp(x)関数をTaylorシリーズに拡大しようとしています。これがコードです:
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;
}
問題は、私がBig XまたはネガティブXを入力すると、プログラムがクラッシュすることです。また、「0.00000000001」のようにxを入力すると、結果は-1です。
アドバイスが必要です。手伝ってくれてありがとう。
解決
大きなX値(約700以上)の場合、ダブル(10^308)の範囲制限を押して、無限のループを引き起こします。あなたはそれについて多くのことをすることはできません、あなたはx入力範囲を制限するか、いくつかの大きな数字ライブラリを使用して拡張範囲を持つ必要があります。
別の回避策は、これをループに追加することです。
if (sum > 1E305) {
// we'll most likely run into an infinite loop
break;
}
注意して、非常に大きな誤った結果を印刷しないように、このケースをその後ループの外側で処理する必要があります。
問題を再現することはできません 0.00000000001
, 、これは私のために1を返します。負の値も正常に実行されますが、結果は間違っていますが、これはアルゴリズムのエラー/制限のようです。編集:これを修正するには、 e^-x
と同じです 1 / e^x
.
コード:
#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;
}
他のヒント
アドバイスが必要です。
デバッガーでプログラムをステップして、どこで間違っているのかを確認してみてください。デバッガーがない場合は、ループ内に印刷ステートメントを挿入して、変更される変数の値を監視します。
所属していません StackOverflow