简单C程序近似常数e

时间:2012-04-04 13:25:08

标签: c

我正在尝试创建一个程序,将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;
}

4 个答案:

答案 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--)