gpt4 book ai didi

Fortran 指数运算顺序

转载 作者:行者123 更新时间:2023-12-02 13:47:00 25 4
gpt4 key购买 nike

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

下面是 Fortran 方程的示例:

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

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

Arithmetic expressions are evaluated in accordance with the following priority rules:

  • All exponentiations are performed first; consecutive exponentiations are performed from right to left.
  • All multiplication and divisions are performed next, in the order in which they appear from left to right.

所以我觉得把它翻译成Python,你最终会得到这样的结果:

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

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

这是另一个谜题:

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

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

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

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

最佳答案

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

<小时/>

更正式地说...

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

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

右侧是兴趣表达。由于这是所谓的 2 级表达式,因此我将仅用最多的术语进行解释。

该表达式的基本元素是常量 1 和变量 abcd。我们还有许多运算符 +***

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

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

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

其中power-op**multi-op *(或/)和add-op +(或-)。

将解析放在一起我们有:

  • 1 + 添加操作数
  • 1 + ( 加操作数 * 多操作数 )
  • 1 + ( ( a * 多操作数 ) * ( 多操作数 ) )
  • 1 + ( ( a * ( b ** c ) ) * ( c ** d ) )

最后一点,括号内的表达式是主表达式。这确保了保留括号优先级的期望。

<小时/>

此语法还解释了为什么 a**b**c 被计算为 a**(b**c)

关于Fortran 指数运算顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45721863/

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