Ok-*_*lex 2 c++ taylor-series exp
我试图将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;
Run Code Online (Sandbox Code Playgroud)
}
问题是当我输入大X或负X时我的程序崩溃了.当我像"0.00000000001"那样输入X时,结果是-1.
需要建议.感谢帮助.
对于大X值(大约700及以上),您将达到双精度范围限制(10 ^ 308)并导致无限循环.你不能做太多,你应该限制X输入范围或使用一些大数字库来扩展范围.
另一种解决方法是将其添加到循环中:
if (sum > 1E305) {
// we'll most likely run into an infinite loop
break;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您应该在循环之外处理此情况,以避免打印非常大的错误结果.
我无法重现这个问题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;
}
Run Code Online (Sandbox Code Playgroud)