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 回答