如何用c编写exp(x)?

如何用c编写exp(x)?,c,recursion,exp,C,Recursion,Exp,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

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;
}
#包括
#定义N 13
席西3
双fun7(整数n,整数m){
int i;
双res=1,aux=0;

对于(i=1,aux=1;i而言,
float
数据类型通常可以表示精度超过7位小数的数字

485165184有9个十进制数字。最后两个数字就<代码>浮点
而言只是无意义的噪声。您真的应该显示4.851652e8,这是给定精度级别下exp(20)的正确值


如果您想提高精度,请尝试使用
double
long double
数据类型。

您可以尝试将其转换为long double吗?
float
-->
double
有一些方法可以计算e(x),而无需经过阶乘……查看维基百科、谷歌……“这是一个家庭作业”:您不应该有更明确的标识符吗?“用计算器检查我的结果”-->最好让代码检查
exp()
。此外,可能是他以错误的顺序求和使事情变得更糟了。当你对级数求和时,你必须从最小的项开始,否则当用一个足够大的部分和求和时,它们将被忽略,而不是用足够多的尾数。@MatteoItalia同意对项求和,但使用
exp()
还有一个额外的挑战,最小的项不仅在序列的一端,而且在序列的两端。谢谢@n.m。我将数组类型从float改为double,这解决了我的问题。@MatteoItalia我使用第一个(1.0)中的所有项对其进行了编码直到术语<1e-17。然后按不同顺序添加,包括最小值到最大值、L到R和R到L。我确实发现使用最小值到最大值给出了最佳答案,但平均值(0.04)和最坏情况(50)ULP差异表明只有适度的,可能是20%的改进,但计算/空间成本并不那么微不足道。因此,至少对于
exp()
,最好使用其他技术来改进,而不是尝试通过加法顺序来改进。依我看,最小的ot最大值与交替符号串联时更有价值。