C 编程e^x无穷级数

C 编程e^x无穷级数,c,debugging,approximate,C,Debugging,Approximate,我必须找到1+x/1的值+x^2/2!+ 这是我的密码: void main() { long int a, i = 0; double p, e, x, sum = 1, t = 1; printf("Enter desired number of decimal places\n"); scanf("%d", &a); printf("Enter x\n"); scanf("%d", &x); e = pow(10, -a); do

我必须找到1+x/1的值+x^2/2!+

这是我的密码:

void main()
{
  long int a, i = 0;
  double p, e, x, sum = 1, t = 1;

  printf("Enter desired number of decimal places\n");
  scanf("%d", &a);

  printf("Enter x\n");
  scanf("%d", &x);

  e = pow(10, -a);

  do
  {
    t = x * t / (double) (i + 1);
    sum = sum + t;
    p = fabs(t);
    i++;
    printf("Sum is %ld\n", sum);
  } while ((p > e) && (i < 10000));
}
void main()
{
长整数a,i=0;
双p,e,x,和=1,t=1;
printf(“输入所需的小数位数\n”);
scanf(“%d”和“&a”);
printf(“输入x\n”);
scanf(“%d”和&x);
e=功率(10,-a);
做
{
t=x*t/(双倍)(i+1);
sum=sum+t;
p=fabs(t);
i++;
printf(“总和为%ld\n”,总和);
}而((p>e)&(i<10000));
}
我的程序逻辑如下:

我让用户输入x和精度(a)。我的错误是10^(-a)。我是我的柜台。sum是我的系列之和。t表示我的条件

我从t=1开始,使用递归t=(x*t)/(double)(I+1)。[注意:因为i是int,t是double,所以我在这里进行类型转换。]

例如,如果我选择x=5,那么t=1被初始化。接下来我得到t=5/1=5。Sum初始化为1。所以sum现在变成sum=1+5=6。然后我变成1。所以t变成5*5/2=12.5。所以我现在的总数应该是6+12.5。。。。这样的话,我现在就应该做了

现在,对于while部分,p是t的绝对值。(n+1)项和n项之和的差值为p。所以当我的p小于e时,我应该得到我想要的和,对吗?如果序列是发散的,为了避免无限循环,只要我的I改变这个,我就让do{}部分运行

scanf("%d", &x);
为此:

scanf("%lf", &x);
至少要使用
x
,您希望不会引发未定义的行为

对于
prinf()。这里不需要长度修饰符
l
,因为
printf()
f
代表
double
。奇怪,但事实就是这样

printf("Sum is %f\n", sum);

此外,您正在使用错误的转换说明符来扫描
,这是一个长的
,因此它应该是:

scanf("%ld", &a);

另外^2它(至少)
intmain(void)

根据C11标准:

5.1.2.2.1/1程序启动

程序启动时调用的函数名为main。实现声明没有 此功能的原型。它应定义为int返回类型,且不包含 参数:

int main(void){/*…*/}

或者使用两个参数(此处称为argc和argv,但可以使用任何名称) 使用,因为它们是声明它们的函数的本地函数):

intmain(intargc,char*argv[]){/*…*/}


此外,^3您的代码段未包含相关头文件


最后,请注意:编译时,所有警告均打开,并严肃对待。

更改此选项

scanf("%d", &x);
为此:

scanf("%lf", &x);
至少要使用
x
,您希望不会引发未定义的行为

对于
prinf()。这里不需要长度修饰符
l
,因为
printf()
f
代表
double
。奇怪,但事实就是这样

printf("Sum is %f\n", sum);

此外,您正在使用错误的转换说明符来扫描
,这是一个长的
,因此它应该是:

scanf("%ld", &a);

另外^2它(至少)
intmain(void)

根据C11标准:

5.1.2.2.1/1程序启动

程序启动时调用的函数名为main。实现声明没有 此功能的原型。它应定义为int返回类型,且不包含 参数:

int main(void){/*…*/}

或者使用两个参数(此处称为argc和argv,但可以使用任何名称) 使用,因为它们是声明它们的函数的本地函数):

intmain(intargc,char*argv[]){/*…*/}


此外,^3您的代码段未包含相关头文件



最后,请注意:编译时所有警告都打开,并严肃对待它们。

在这个答案中,我使用了小数位数来设置术语的格式,并通过将和格式化为字符串来测试序列是否收敛,这是格式化输出所需的

#include <stdio.h>
#include <string.h>

int main ()
{
    double sum=1, term=1;
    int n=1, x=1, dp=0;
    char current[50]="", previous[50]="";

    printf ("Enter number of decimal places: ");
    scanf ("%d", &dp);
    printf ("Enter x: ");
    scanf ("%d", &x);
    printf ("Series for x=%d to %d decimal places\n", x, dp);

    do {
        strcpy (previous, current);
        sprintf (current, "%-10.*f", dp, sum);
        printf ("Term = %-10.*f Sum = %s\n", dp, term, current);
        term = term * (double)x / (double)n;
        sum += term;
        n++;
    } while (strcmp(previous, current));
    return 0;
}

在这个答案中,我使用了小数位来设置术语的格式,并通过将和格式化为字符串来测试序列是否收敛,这是格式化输出所必需的

#include <stdio.h>
#include <string.h>

int main ()
{
    double sum=1, term=1;
    int n=1, x=1, dp=0;
    char current[50]="", previous[50]="";

    printf ("Enter number of decimal places: ");
    scanf ("%d", &dp);
    printf ("Enter x: ");
    scanf ("%d", &x);
    printf ("Series for x=%d to %d decimal places\n", x, dp);

    do {
        strcpy (previous, current);
        sprintf (current, "%-10.*f", dp, sum);
        printf ("Term = %-10.*f Sum = %s\n", dp, term, current);
        term = term * (double)x / (double)n;
        sum += term;
        n++;
    } while (strcmp(previous, current));
    return 0;
}

scanf(“%d”和&x)
看起来很难看(因为
x
double
)。此外,您可能希望使用符号(
-g
用于gcc)进行编译,并在调试器(gdb用于gcc)中运行代码,然后逐行检查任何相关变量的值,您可能会有所了解。另外^2:无需在此处强制转换:
t=x*t/(double)(i+1)
问题标题中的
e
代表什么?@alk“e”当然代表这个
scanf(“%d”和&x)
看起来很难看(因为
x
double
)。此外,您可能希望使用符号(
-g
用于gcc)进行编译,并在调试器(gdb用于gcc)中运行代码,然后逐行检查任何相关变量的值,您可能会有所了解。另外^2:无需在此处强制转换:
t=x*t/(double)(i+1)
你的问题标题中的
e
代表什么?@alk当然“e”代表你可能想对结尾的
printf
语句做同样的处理。是的,我添加了stdio、conio、math头文件。我做了更改,但仍有错误。现在对于x=5,它是一个“POW:Overflow.sum=6.00000”。另外,您能解释一下为什么我应该使用int main()而不是void main()?“为什么[…]使用
int main()
而不是
void main()
?”请查看我的更新答案@DIYA您可能希望在e.com上对
printf
语句执行相同的操作