Fortran 指数运算顺序

nuc*_*eon 2 fortran operator-precedence

我正在将一些 Fortran 翻译成 Javascript,对于特定类别的方程,指数的运算顺序对我来说非常不透明。

下面是 Fortran 方程的一个例子:

x = 1+a*b**c*c**d
Run Code Online (Sandbox Code Playgroud)

Fortran 中的指数用 ** 运算符指定。这个页面给出了一些提示:

算术表达式根据以下优先级规则进行计算:

  • 首先执行所有求幂;从右到左执行连续的求幂。
  • 接下来执行所有乘法和除法,按照它们从左到右出现的顺序进行。

所以我觉得把它翻译成 Python,你最终会得到类似的东西:

x = 1+a*pow(b,c)*pow(c,d)
Run Code Online (Sandbox Code Playgroud)

但这并没有让我得到我期望的答案,所以我想检查这是否合理(因为即使在最好的情况下,操作顺序也不是我的强项,当然不是语言我不是很熟悉)。

这是另一个谜题:

x = a*(1-(1-a)**b)+(1-a)*(a)**(1/b)
Run Code Online (Sandbox Code Playgroud)

哎呀!这让我头疼。(把那个单独的 (a) 放在括号里重要吗?)至少这个有括号,这表明:

x = a*(1-pow(1-a,b))+(1-a)*pow(a,1/b)
Run Code Online (Sandbox Code Playgroud)

但我仍然不确定我是否理解这一点。

fra*_*lus 5

您可以根据运算符的优先级来看待这一点。 ***比二进制更高的优先级+。然后表达式1+a*b**c*c**d就像1+a*(b**c)*(c**d)


更正式...

用Fortran表达式通过包括以下项的语法描述初选1级5级的表达式。让我们用问题的例子来看看这些

x = 1+a*b**c*c**d
Run Code Online (Sandbox Code Playgroud)

右边是兴趣表达。由于这是一个所谓的 2 级表达式,因此我将仅在此之前进行解释。

此表达式的主要元素是常量1和变量abcd。我们还有一些运算符+,***

初级都是一级表达式,由于这里没有定义的一元运算符,我们将直接进入二级表达式。

2 级表达式由规则定义(引用 F2008 7.1.2.4):

  • 多操作数是 level-1-expr [ power-op 多操作数 ]
  • 添加操作数是 [ 添加操作数多操作 ] 多操作数
  • level-2-expr 是 [ [ level-2-expr ] add-op ] add-operand

其中power-op**多操作 *(或/)和附加操作 +(或-)。

将解析放在一起,我们有:

  • 1 + add-operand
  • 1 + ( add-operand * mult-operand )
  • 1 + ( ( a * mult-operand ) * ( mult-operand ) )
  • 1 + ( ( a * ( b ** c ) ) * ( c ** d ) )

最后要注意的是,括在括号中的表达式是主表达式。这确保保留括号优先的期望。


这个语法也解释了为什么a**b**c被评估为a**(b**c)