0

だから私はこの問題をやろうとしています:

問題

しかし、どこから始めればいいのか、正確に何を探しているのか、完全にはわかりません。

さらに、ゼロ(0)、非常に小さい(0.00001)、それほど小さくない(0.1)などのプログラム入力を期待する必要があると言われました。

参照としてhttp://en.wikipedia.org/wiki/E_%28mathematical_constant%29が与えられましたが、その式は問題の式とまったく同じではありません。

そして最後に、プログラムへの入力は少数のイプシロンであると言われました。たとえば、0.00001fと仮定できます。

現在の項の値がイプシロンを下回るまで、無限級数を追加し続けます。

しかし、全体として、それが何を意味するのか私にはわかりません。私はwikiの方程式をある程度理解しています。しかし、与えられた問題からどこから始めればよいのかわかりません。それを見て、私がCで使用しようとしている数式の種類、「E」とは何か、そしてそれがここで機能する場所を知っている人はいますか(つまり、数式内では、ユーザー入力であると想定されています)。

これまでのコード

#include <stdio.h>
#include <math.h>

//Program that takes in multiple dates and determines the earliest one
int main(void)
{
    float e = 0;
    float s = 0;
    float ct = 1;
    float ot= 1;
    int n = 0;
    float i = 0;
    float den = 0;
    int count = 0;

    printf("Enter a value for E: ");
    scanf("%f", &e);

    printf("The value of e is: %f", e);


    for(n = 0; ct > e; n++)
    {
        count++;
            printf("The value of the current term is: %f", ct);

        printf("In here %d\n", count);

        den = 0;

        for(i = n; i > 0; i--)
        {
            den *= i;
        }

        //If the old term is one (meaning the very first term), then just set that to the current term
        if (ot= 1)
        {
            ct = ot - (1.0/den);
        }
        //If n is even, add the term as per the rules of the formula
        else if (n%2 == 0)
        {
            ct = ot + (1.0/den);
            ot = ct;
        }
        //Else if n is odd, subtract the term as per the rules of the formula
        else
        {
            ct = ot - (1.0/den);
            ot = ct;
        }

        //If the current term becomes less than epsilon (the user input), printout the value and break from the loop
        if (ct < epsilon)
        {
            printf("%f is less than %f",ct ,e);
            break;
        }
    }

    return 0;
}

電流出力

Enter a value for E: .00001
The value of e is: 0.000010
The value of the current term is: 1.000000
In here 1
-1.#INF00 is less than 0.000010

ですから、皆さんのコメントに基づいて、そして私が言われたようにウィキペディアからの4番目の「混乱」方程式を使用して、これは私が思いついたコードです。私の頭の中の論理は、誰もが言っていることと一致しているようです。しかし、出力は私が達成しようとしているものではありません。このコードを見て、私が間違っている可能性があることを誰かが知っていますか?

4

5 に答える 5

2

Σは合計を表すため、方程式は、n = 0から始まり、無限大に向かう項の合計を計算することを意味します。

ここに画像の説明を入力してください

表記n!は、1からnまでの数字の積である「階乗」を意味します。

ここに画像の説明を入力してください

より正確に計算された各反復は、実際の値を表します。 εは、反復がε量未満しか変化していないことを意味する誤差項です。

相互作用の計算を開始するには、いくつかの開始条件が必要です。

unsigned int n = 0; // Iteration.  Start with n=0;
double fact = 1;    // 0! = 1.  Keep running product of iteration numbers for factorial.
double sum = 0;     // Starting summation.  Keep a running sum of terms.
double last;        // Sum of previous iteration for computing e
double e;           // epsilon value for deciding when done.

次に、アルゴリズムは単純です。

  1. 前の合計を保存します。
  2. 次の合計を計算します。
  3. nを更新し、次の階乗を計算します。
  4. 新しい反復と古い反復の差がイプシロンを超えているかどうかを確認します。

コード:

do {
    last = sum;
    sum += 1/fact;
    fact *= ++n;
} while(sum-last >= e);
于 2012-10-08T01:56:29.113 に答える
1

あなたは最初のCプログラムを書く必要があります。そのためのインターウェブには、argc変数とargv変数からユーザー入力を取得する方法など、多くのソースがあります。入力されていない場合は、イプシロンに0.00001fを使用するようです。(これを使用して、入力を受け入れるようにする前に、プログラムを機能させます。)

系列を計算するには、ループといくつかの変数(sum、current_term、およびn)を使用します。各ループ反復で、nを使用してcurrent_termを計算し、nをインクリメントし、現在の項がイプシロンよりも小さいかどうかを確認し、そうでない場合は、current_termを合計に追加します。

ここで避けるべき大きな落とし穴は、誤って整数除算を計算することです。たとえば、1/nのような式は避けたいでしょう。このような式を使用する場合は、代わりに1.0/nを使用してください。

于 2012-10-07T16:23:58.227 に答える
1

その合計記号はあなたに手がかりを与えます:あなたはループが必要です。

なに0!?1、もちろん。したがって、eの開始値は1です。

次に、1からより大きな値までのnのループを作成し(無限大はwhileループを示唆する場合があります)、連続する各項を計算し、そのサイズがイプシロンを超えているかどうかを確認し、eの合計に追加します。

項がイプシロンより小さくなったら、ループを停止します。

今のところ、ユーザー入力について心配する必要はありません。関数を機能させます。イプシロンをハードコーディングし、変更するとどうなるかを確認します。最後のビットの入力を残します。

優れた階乗関数が必要です。(真実ではありません-私に思い出させてくれたMatに感謝します。)

定数eはどこから来るのか尋ねましたか?そしてシリーズ?級数は、指数関数のテイラー級数展開です。イントロ微積分のテキストを参照してください。また、定数eは、指数1の単純な指数関数です。

ここで動作するJavaバージョンがありますが、投稿は控えます。C関数と同じように見えるので、譲りたくありません。

更新:あなたがあなたのものを見せたので、私はあなたに私のものを見せます:

package cruft;

/**
 * MathConstant uses infinite series to calculate constants (e.g. Euler)
 * @author Michael
 * @link
 * @since 10/7/12 12:24 PM
 */
public class MathConstant {

    public static void main(String[] args) {
        double epsilon = 1.0e-25;
        System.out.println(String.format("e = %40.35f", e(epsilon)));
    }

    // value should be 2.71828182845904523536028747135266249775724709369995
    //          e =    2.718281828459045
    public static double e(double epsilon) {
        double euler = 1.0;
        double term = 1.0;
        int n = 1;
        while (term > epsilon) {
            term /= n++;
            euler += term;
        }
        return euler;
    }
}

しかし、階乗関数が必要な場合は、素朴な学生の実装よりも、テーブル、メモ化、およびガンマ関数をお勧めします。あなたがそれらが何であるかわからないならば、それらのためのグーグル。幸運を。

于 2012-10-07T16:22:25.503 に答える
1

実際、このプログラムは、DeitelによるCのプログラムの学習で与えられたものと非常によく似ています(エラーは0になることはできません。これは、eが無理数であるため、正確に計算できないためです)。私はここにあなたにとって非常に役立つかもしれないコードを持っています。

#include <stdio.h>


/* Function Prototypes*/
long double eulerCalculator( float error, signed long int *iterations );
signed long int factorial( int j );


/* The main body of the program */
int main( void ) 
{
    /*Variable declaration*/
    float error;
    signed long int iterations = 1;

    printf( "Max Epsilon admited: " );
    scanf( "%f", &error );
    printf( "\n The Euler calculated is: %f\n", eulerCalculator( error, &iterations ) ); 
    printf( "\n The last calculated fraction is: %f\n", factorial( iterations ) );
    return 1;
}


long double eulerCalculator( float error, signed long int *iterations ) 
{
    /* We declare the variables*/
    long double n, ecalc;


    /* We initialize result and e constant*/
    ecalc = 1; 

    /* While the error is higher than than the calcualted different keep the loop */
    do {

        n = ( ( long double ) ( 1.0 / factorial( *iterations ) ) );
        ecalc += n;
        ++*iterations;

    } while ( error < n );


    return ecalc;
}

signed long int factorial( signed long int j )
{
    signed long int b = j - 1;

    for (; b > 1; b--){
        j *= b;
    }

    return j;
}
于 2012-10-07T22:16:35.850 に答える
1

MAIN関数とFUNCTIONを記述して、以下の級数のおおよその合計を計算します。

            (n!)/(2n+1)!  (from n=1 to infinity)

MAIN機能内:

  • 標準入力からタイプDOUBLE(望ましい精度)の変数EPSILONを読み取ります。EPSILONは、10 ^(-6)以下の非常に小さい正の数です。
  • EPSILON値は、引数としてFUNCTIONに渡されます。

関数内:

  • do-whileループの場合:
    • | Sn +1-Sn|まで用語を合計し続けます <EPSILON。
    • Snは、最初のn項の合計です。
    • Sn + 1は、最初の(n + 1)項の合計です。必要な精度のEPSILONに達したら、SUMと合計に追加されたTERMSの数を出力します。

一度に1つずつ異なるEPSILON値(10 ^(-6)から10 ^(-12))でプログラムをテストします。

于 2013-03-23T13:31:03.370 に答える