0

我正在尝试创建一个将 e (e=1+1/1!+1/2!+1/3!+...) 近似为限制因子 epsilon 的程序。程序应继续添加项,直到当前语句变得小于 epsilon,其中 epsilon 是用户输入的一个小(浮点)数。

我可以编写将 e 近似为第 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;
}
4

4 回答 4

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;
}
于 2012-04-04T13:46:43.287 回答
1

Go to 可能是有害的,您应该尽量减少对它的使用。你的第二个循环永远不会执行,因为 1 永远不会小于 1。如果你想跳出这样的循环,那么 while 构造就可以了。沿着这条线的东西:

while(1)
   Do stuff until you get what you want. A second loop here should do.
   break;

使用它应该使您的程序工作。

于 2012-04-04T13:56:42.473 回答
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;
}
于 2012-04-04T13:55:07.113 回答
0

您没有初始化变量e。在进入循环之前初始化变量:

e = 1;

您可能还打算使用该变量在内部循环中i进行初始化。循环条件似乎也被颠倒了。采用lfor

for(l = i; l > 0; l--)

代替

for(l = 1; l < 1; l--)
于 2012-04-04T14:20:26.177 回答