我正在尝试创建一个程序,将e(e = 1 + 1/1!+1/2!+1/3!+ ...)近似为限制因子epsilon。程序应该继续添加术语,直到当前语句变得小于epsilon,其中epsilon是用户输入的小(浮点)数字。
我可以编写近似于第n个术语的程序,但是当最近一个术语小于epsilon时,我很难将其停止。
非常感谢任何帮助。
#include <stdio.h>
int main(void)
{
int i=1,l;
float e,p,epsilon;
printf("Enter the value of epsilon: ");
scanf("%f", &epsilon);
for(;;)
{
p=1;
for(l = 1; l < 1; l--)
{
p*=l;
if (1/p<epsilon) {
goto done;
}
}
e+=1/p;
i++;
}
done:
printf("The value of e limited by epsilon is %f\n",e);
return 0;
}
答案 0 :(得分:3)
这些方面的东西可以帮助你
double expo ( double x, double epsilon )
{
double sum=0;
unsigned i=0;
double fact=0;
double factorial=1;
while ( 1 )
{
fact=1/factorial;
if ((fact-epsilon) < 0.000001) /* Comparing doubles. Am I safe here? */
break;
sum+=fact;
i++;
factorial*=i;
}
return sum;
}
答案 1 :(得分:1)
转到可以harmful,您应该尽量减少使用它。 你的第二个循环将永远不会执行,因为1永远不会小于1.如果你想要打破这样的循环,那么一个while构造就可以了。这方面的事情:
while(1)
Do stuff until you get what you want. A second loop here should do.
break;
使用此功能可以使您的程序正常运行。
答案 2 :(得分:0)
这是我的解决方案:
double eulersNumber(double epsilon)
{
double e = 0;
double factorial = 1;
for (int i = 1; TRUE; i++) {
double add = 1.0 / factorial;
if (add < epsilon)
break;
e += add;
factorial *= i;
}
return e;
}
答案 3 :(得分:0)
您没有初始化变量e
。在进入循环之前初始化变量:
e = 1;
您也可能打算使用变量i
初始化内部l
循环中的for
。循环条件似乎也是相反的。使用
for(l = i; l > 0; l--)
而不是
for(l = 1; l < 1; l--)