我正在将一些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)
但我仍然不确定我是否理解这一点。
答案 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
和变量a
,b
,c
和d
。我们还有许多运营商+
,**
和*
。
原色是所有1级表达式,由于这里没有定义的一元运算符,我们将直接进入2级表达式。
第2级表达式由规则定义(引用F2008 7.1.2.4):
其中 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