gpt4 book ai didi

scala - 为什么添加括号会改变这个 Scala 表达式的结果?

转载 作者:行者123 更新时间:2023-12-03 04:18:42 25 4
gpt4 key购买 nike

我正在将一些 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 版本完全匹配。当有括号时和没有括号时,运算顺序似乎必须不同,但我不明白为什么这会产生任何差异。知道这里发生了什么吗?

最佳答案

这是因为分号推断。示例(//; - 推断的分号):

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

带括号:

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

或者带尾部“+”:

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

The rules of semicolon inference
A line ending is treated as a semicolon unless one of the following conditions is true:

  1. The line in question ends in a word that would not be legal as the end of a statement, such as a period or an infix operator.

  2. The next line begins with a word that cannot start a statement.

  3. The line ends while inside parentheses (...) or brackets [...], because these cannot contain multiple statements anyway.

关于scala - 为什么添加括号会改变这个 Scala 表达式的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12878634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com