8

浮動小数点演算を多用するCコードをScalaに移植しています。Cバージョンのコピー/貼り付けに基づいてScalaで次のコードを作成しました。

val complimentaryTerms = 2640.96e-6 * sin (f5)
          +  63.52e-6 * sin (2.0 * f5)
          +  11.75e-6 * sin (2.0 * f3 - 2.0 * f4 + 3.0 * f5)
          +  11.21e-6 * sin (2.0 * f3 - 2.0 * f4 +       f5)
          -  4.55e-6 * sin (2.0 * f3 - 2.0 * f4 + 2.0 * f5)
          +  2.02e-6 * sin (2.0 * f3            + 3.0 * f5)
          +  1.98e-6 * sin (2.0 * f3            +       f5)
          -  1.72e-6 * sin (3.0 * f5)
          -  0.87e-6 * t * sin (f5)

この計算の結果は、Cバージョンが生成するものとは少し異なります。ただし、次のように式を括弧で囲むと、次のようになります。

val complimentaryTerms = (2640.96e-6 * sin (f5)
          +  63.52e-6 * sin (2.0 * f5)
          +  11.75e-6 * sin (2.0 * f3 - 2.0 * f4 + 3.0 * f5)
          +  11.21e-6 * sin (2.0 * f3 - 2.0 * f4 +       f5)
          -  4.55e-6 * sin (2.0 * f3 - 2.0 * f4 + 2.0 * f5)
          +  2.02e-6 * sin (2.0 * f3            + 3.0 * f5)
          +  1.98e-6 * sin (2.0 * f3            +       f5)
          -  1.72e-6 * sin (3.0 * f5)
          -  0.87e-6 * t * sin (f5))

結果の値は、Cバージョンと完全に一致します。括弧がある場合とない場合では、演算の順序が違うように見えますが、なぜそれが違いを生むのかわかりません。ここで何が起こっているのか分かりますか?

4

1 に答える 1

14

セミコロンの推論によるものです。サンプル(//;-推定セミコロン):

val x = 1 //;
        + 1 //;
println(x) // 1

そして括弧付き:

val x = (1
        + 1) //;
println(x) // 2

または末尾に「+」を付ける:

val x = 1 +
        1 //;
println(x) // 2

セミコロン推論の規則
次の条件のいずれかが当てはまらない限り、行末はセミコロンとして扱われます。

  1. 問題の行は、ピリオドや中置演算子など、ステートメントの終わりとしては合法ではない単語で終わります。

  2. 次の行は、ステートメントを開始できない単語で始まります。

  3. とにかく複数のステートメントを含めることはできないため、行は括弧(...)または角かっこ[...]の内側で終了します。

于 2012-10-14T02:22:11.267 に答える