C 编程e^x无穷级数
我必须找到1+x/1的值+x^2/2!+ 这是我的密码: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
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
语句执行相同的操作