Fortran对指数的操作顺序

时间:2017-08-16 19:49:11

标签: fortran operator-precedence

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

以下是Fortran等式的示例:

x = 1+a*b**c*c**d

Fortran中的指数用**运算符指定。 This page给出了一些提示:

  

根据以下优先级规则评估算术表达式:

     
      
  • 首先执行所有取幂;连续取幂从右到左执行。
  •   
  • 接下来按照从左到右显示的顺序执行所有乘法和除法。
  •   

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

x = 1+a*pow(b,c)*pow(c,d)

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

这是另一个益智游戏:

x = a*(1-(1-a)**b)+(1-a)*(a)**(1/b)

Oy公司!这伤害了我的头脑。 (将那个孤独的(a)放在parens中是否重要?)至少这个有parens,这表明:

x = a*(1-pow(1-a,b))+(1-a)*pow(a,1/b)

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

2 个答案:

答案 0 :(得分:4)

您可以根据运营商的优先级来看待这一点。 **的优先级高于*,高于二进制+。表达式1+a*b**c*c**d就像1+a*(b**c)*(c**d)

更正式......

Fortran中的表达式由 primaries level-1 level-5 表达式组成的语法描述。让我们使用问题的例子来看待这些问题

x = 1+a*b**c*c**d

右边这是感兴趣的表达。由于这是一个所谓的二级表达,我只能用这个来解释。

此表达式的原色是常量1和变量abcd。我们还有许多运营商+***

原色是所有1级表达式,由于这里没有定义的一元运算符,我们将直接进入2级表达式。

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

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

其中 power-op **多操作 *(或/)和添加 - 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)

答案 1 :(得分:0)

用于说明(注释中没有 HTML)。

Fortran:File "/home/988659d072a77d5e9b58fa933c5d006f.py", line 7 loss = -1/n * sum ^ SyntaxError: invalid syntax === 数学:3ja1 3**j**a**1 === 1 + a×bc×cd

相关问题