我试图在不使用math.h的情况下计算ex。当x大于或小于约±20时,我的代码会给出错误的答案。我尝试将所有double类型更改为long double类型,但在输入上它会产生一些垃圾。
我的代码如下:
#include <stdio.h>
double fabs1(double x) {
if(x >= 0){
return x;
} else {
return x*(-1);
}
}
double powerex(double x) {
double a = 1.0, e = a;
for (int n = 1; fabs1(a) > 0.001; ++n) {
a = a * x / n;
e += a;
}
return e;
}
int main(){
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int n;
scanf("%d", &n);
for(int i = 0; i<n; i++) {
double number;
scanf("%lf", &number);
double e = powerex(number);
printf("%0.15g\n", e);
}
return 0;
}
输入:
8
0.0
1.0
-1.0
2.0
-2.0
100.0
-100.0
0.189376476361643
我的输出:
1
2.71825396825397
0.367857142857143
7.38899470899471
0.135379188712522
2.68811714181613e+043
-2.91375564689153e+025
1.20849374134639
正确的输出:
1
2.71828182845905
0.367879441171442
7.38905609893065
0.135335283236613
2.68811714181614e+43
3.72007597602084e-44
1.20849583696666
你可以看到我的 e−100 的答案完全是错误的。为什么我的代码会输出这个?我可以做些什么来改进这个算法?
a
的值何时开始偏离预期。 - Eugene Sh.int
溢出吗? - Alex Gutenievfor (int n = 1; fabs1(a) > 0.001; ++n) {
,您强制近似通常不会比0.001更好。 - Damien