ホーム>source
<前>ウィズウィズ

私はJavaを初めて使用するので、このループがどのように機能するかを明確にしたいと思います。ループは、指数を1の累乗に近似することになっています。

ウィズウィズ

私がしている間違いは何ですか?

また、facとexpを0.0に初期化するポイントは何ですか? (コードの3行目)

public class exp { public static void main(final String args[]) { int i, numTerms = 10; double fac, exp = 0.0; for (i = 0, fac = 1.0; i < numTerms; i++, fac *= i) { exp += 1.0/fac; } System.out.println("exp(1) = "+exp); System.out.println("Error is "+Math.abs(Math.E-exp)); } }
あなたの答え
  • 解決した方法 # 1

    このコード全体は、数学定数 e を計算する数値的方法です  (自然対数の底)、しかしあなたはすでにそれを知っています。

    forループの構文では、複数の変数を宣言できますが、それらは同じ型でなければなりません。
    そのため、 i  そして fac  ループの前に宣言されました。
    ウィズウィズ  ステートメントは両方の変数を宣言しますが、 double fac, exp = 0.0; のみを初期化します 、同様のことが exp に行きます 。

    数値的方法で行われる計算の精度は、ステップ数(この場合は、指定された反復回数)に厳密に依存します。
    ステップ数が不十分な場合、計算値は非常に不正確になる可能性があります(または int i... を作成する場合のように)  または numTerms=0  -完全に間違った出力)。

    あなたは0のために正しいです。

    numTerms=1 の場合 、1です。最初の反復では numTerms=1  等しい0、 i   fac に初期化されます 。ウィズウィズ  コードブロックの後に計算されます。

    1.0 の場合 : fac*=i  2に達すると、ループの条件はfalseになります。

    <前>ウィズウィズ

    ループ条件がfalseの場合、そのブロックは実行されません。
    一部 numTerms=2  混乱するかもしれませんが、forループは次のようになります。

    <前>ウィズウィズ

    開始する前に、初期化(変数がある場合)を行い、次に条件をチェックします(変数はすでに条件の制限を超えている可能性があります)。条件が真の場合、コードブロックが呼び出されます。
    コードブロックの後、 i  式が呼び出され、コードブロックを実行する前に、条件が再度チェックされます。
    だからそれは行くでしょう:

    ウィズウィズ

    2回目の反復後、「更新」式が評価され、i = 2、fac = 2が作成されますが、 i < numTerms - 2 < 2 <- which is false の場合  ループ条件は偽です。

    「0はどのように正確に導き出されるのか」がよくわかりません。あなたの質問から、しかし私はすでにそれに答えたことを願っています:)

    そして、おそらく興味深い事実です。あなたは i++, fac *= i の初期化についてそこで尋ねました  そして for(initialization;condition;increment/update) 、実際にはforループで発生します。しかし、それを行うことは可能です:

    <前>ウィズウィズ

    forループはwhileに書き換えることができ、その逆も可能です。
    increment/update を書く  

    1st iteration: i=0, fac=1 ->exp+=1/1 =>exp=1
    2nd iteration: i=1, fac=1 ->exp+=1/1 =>exp=2

    と同じ 。

    i=2

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ swing - JTabbedPaneを更新できません