2

このクラス定義を考えると:

package {
  public class Calc {
    public static function I(i:Number, s:Number):Number {
      var A:Number = helper_A(s);
      var B:Number = helper_B(s);
      var C:Number = helper_C(s);      
      return A * i + (Math.exp(B * i + C) - Math.exp(C) / B);
    }   
  }
}

静的関数helper_Ahelper_B およびhelper_Cいくつかの数学演算を実行します (基本的な計算と を含むワンライナーMath.pow())。

これを呼び出すと

trace(Calc.I(27, 1985));

次の return ステートメントの括弧の配置の違いがfunction I、計算結果にどのように影響する可能性がありますか?


このバージョン 1)

      return A * i + (Math.exp(B * i + C) - Math.exp(C) / B);

痕跡0.01721552341268775


このバージョン 2)

      return A * i + ((Math.exp(B * i + C) - Math.exp(C)) / B);

痕跡0.017092065919602526


私が言えることから、結果は数学的に同じでなければなりません。Actionscript/Flashが括弧なしで誤った結果を計算するのはなぜですか? ここで奇妙な内部キャッシング、順序、メモリ、フーバーなどがありますか?

4

2 に答える 2

4

(Math.exp(B * i + C) - Math.exp(C) / B);

除算は減算よりも優先されるため、括弧なしMath.exp(C) / Bが最初に実行されます。 /-

((Math.exp(B * i + C) - Math.exp(C)) / B);

ここで(Math.exp(B * i + C) - Math.exp(C))は、括弧のために最初に実行され、次に結果が B で除算されます。これは最初のバージョンとは明らかに異なります。

これは AS3 とは関係ありません。これは明確に定義された数学的ルールです。割り算、掛け算は足し算、引き算よりも優先され、掛け算、割り算の前に足し算、引き算を行うには括弧が必要です。

于 2013-01-21T11:54:20.880 に答える
0

演算子の優先順位を確認してください。ちなみに、外側の括弧は必要ありません:

return A * i + (Math.exp(B * i + C) - Math.exp(C)) / B;
于 2013-01-21T11:58:00.003 に答える