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)
但我仍然不确定我是否理解这一点。
您可以根据运算符的优先级来看待这一点。 **是*比二进制更高的优先级+。然后表达式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和变量a、b、c和d。我们还有一些运算符+,**和*。
初级都是一级表达式,由于这里没有定义的一元运算符,我们将直接进入二级表达式。
2 级表达式由规则定义(引用 F2008 7.1.2.4):
其中power-op是**,多操作 *(或/)和附加操作 +(或-)。
将解析放在一起,我们有:
1 + add-operand1 + ( add-operand * mult-operand )1 + ( ( a * mult-operand ) * ( mult-operand ) )1 + ( ( a * ( b ** c ) ) * ( c ** d ) )最后要注意的是,括在括号中的表达式是主表达式。这确保保留括号优先的期望。
这个语法也解释了为什么a**b**c被评估为a**(b**c)。
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |