【发布时间】:2022-01-19 17:43:50
【问题描述】:
我正在尝试在不使用 math.h 的情况下查找 ex。当 x 大于或小于 ~±20 时,我的代码给出了错误的答案。我试图将所有双精度类型更改为长双精度类型,但它在输入时产生了一些垃圾。
我的代码是:
#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 的回答是绝对不正确的。为什么我的代码会输出这个?我可以做些什么来改进这个算法?
【问题讨论】:
-
修改代码以在循环中打印
n和a的值,然后针对-100 的情况运行它,看看这些值是什么样的。看看他们有多大。double格式的分辨率是多少?当数字变得那么大时,总和的表示精度如何?您预计会有多大的误差? -
使用调试器运行,或在计算循环中添加中间打印,看看
a的值何时开始偏离预期。 -
会不会有
int溢出? -
GCC 具有内置函数
__builtin_expf和__builtin_expd,您可以调用 as documented here,但我想您的问题实际上更多是关于自己进行计算,而不是避免使用特定的头文件。无论如何,这些函数似乎只是在底层调用 C 库,而不是做更直接的事情。 -
这里
for (int n = 1; fabs1(a) > 0.001; ++n) {,你强加的近似值一般不优于0.001
标签: c math numerical-methods