2

exp 函数有一个系列,看起来像这样: exp(x) = (x^0)/0! + (x^1)/1! + (x^2)/2! + (x^3)/3! + ···。我试图为不同的 x 值计算它,用计算器检查我的结果,我发现对于较大的值,例如 20,我的结果停止增加并陷入几乎是真实的值。我明白485165184.00了,真正的价值是485165195.4

我必须在 for 循环或递归函数中执行此代码,因为它是一项家庭作业。

我的代码如下所示

#include <stdio.h>
#define N 13
#define xi 3

double fun7(int n, int m){
    int i;
    double res=1, aux=0;
    for(i=1, aux=1; i<(n+1); i++){
    res += aux;
    aux *= m;
    aux /= i;
    }
    return res-1;
}



int main() {
    int a, b, pot, x[xi];
    float R[N][xi];

    x[0] = 5;
    x[1] = 10;
    x[2] = 20;

    for(b=0; b<xi; b++){
        for (a=0, pot=1; a<N; a++){
            R[a][b] = fun7(pot, x[b]);
            pot *= 2;
        }
    }

    for(b=0; b<xi; b++){
        for (a=0, pot=1; a<N; a++){
            printf("%d\t%f\n", pot, R[a][b]);
            pot *= 2;
        }
        printf("\n");
    }

    return 0;
}
4

1 回答 1

4

float数据类型通常可以表示精度超过 7 位十进制数字的数字。

485165184 有 9 个十进制数字。就目前而言,最后两位数字只是毫无意义的噪音float。您确实应该显示 4.851652e8,这是具有给定精度级别的 exp(20) 的正确值。

如果要提高精度,请尝试使用doublelong double数据类型。

于 2017-03-09T06:21:28.297 回答