为什么添加括号括号会更改此Scala表达式的结果?

ane*_*son 8 scala

我正在将一些C代码移植到Scala,后者广泛使用浮点运算.我在Scala中根据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)
Run Code Online (Sandbox Code Playgroud)

此计算的结果与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))
Run Code Online (Sandbox Code Playgroud)

结果值与C版本完全匹配.当有括号括起来时,操作顺序似乎必须不同,否则,但我不明白为什么会有任何区别.知道这里发生了什么吗?

Ser*_*nko 14

这是因为分号推断.样本(//;- 推断分号):

val x = 1 //;
        + 1 //;
println(x) // 1
Run Code Online (Sandbox Code Playgroud)

括号:

val x = (1
        + 1) //;
println(x) // 2
Run Code Online (Sandbox Code Playgroud)

或者尾随"+":

val x = 1 +
        1 //;
println(x) // 2
Run Code Online (Sandbox Code Playgroud)

分号推断规则
除非满足下列条件之一,否则将行结尾视为分号:

  1. 有问题的行以单词形式结束,作为语句的结尾不合法,例如句点或中缀运算符.

  2. 下一行以一个无法启动语句的单词开头.

  3. 该行在括号(...)或括号[...]内结束,因为它们无论如何都不能包含多个语句.

  • 它也没有错误,因为有'unary_ +`和`unary_-`方法,即`+ 1.1`是一个有效的表达式,但(例如)`*1.1`不是. (2认同)