0

e (e=1+1/1!+1/2!+1/3!+...) を制限係数イプシロンに近似するプログラムを作成しようとしています。プログラムは、現在のステートメントがイプシロン未満になるまで項を追加し続ける必要があります。ここで、イプシロンはユーザーが入力した小さな (浮動小数点) 数値です。

e を n 番目の項に近似するプログラムを書くことはできますが、最新の項がイプシロン未満になると停止するところまで実行するのに苦労しています。

どんな助けでも大歓迎です。

#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 未満になることは決してないため、2 番目のループは決して実行されません。このようなループから抜け出したい場合は、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

変数を初期化しませんでしたe。ループに入る前に変数を初期化します。

e = 1;

また、変数を使用して内側のループでi初期化することを意図していた可能性もあります。ループ条件も逆になっているようです。使用するlfor

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

それ以外の

for(l = 1; l < 1; l--)
于 2012-04-04T14:20:26.177 に答える
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 に答える