Фортран порядок операций для показателей

Я перевожу некоторый Фортран на Javascript, и порядок операций для показателей степени довольно непрозрачен для определенного класса уравнений.

Вот пример уравнения Фортрана:

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

Экспоненты в Фортране обозначены оператором **. Эта страница дает некоторые советы:

Арифметические выражения оцениваются в соответствии со следующими правилами приоритета:

  • Все возведения в степень выполняются первыми; последовательные возведения в степень выполняются справа налево.
  • Все умножения и деления выполняются далее в том порядке, в котором они отображаются слева направо.

Поэтому мне нравится переводить это, скажем, на Python, в результате вы получите что-то вроде:

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

Но это не дает мне ответов, которых я ожидал, поэтому я хотел проверить, казалось ли это нормальным или нет (потому что порядок операций никогда не был сильным для меня, даже в лучших обстоятельствах, конечно, не с языками Я не очень знаком с).

Вот еще одна загадка:

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

Ой! Это вредит моей голове. (Имеет ли значение одиночество (а) в паренах?) По крайней мере, у этого есть парены, что говорит о:

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

Но я все еще не уверен, что понимаю это.

2 ответа

Решение

Вы можете посмотреть на это с точки зрения приоритета операторов. ** это более высокий приоритет, чем *выше двоичного +, Выражение 1+a*b**c*c**d тогда как 1+a*(b**c)*(c**d),


Более формально...

Выражения в Фортране описываются грамматикой, состоящей из основных цветов и выражений с уровня 1 по уровень 5. Давайте посмотрим на это на примере вопроса

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

с правой стороны это выражение интереса. Поскольку это так называемое выражение уровня 2, я объясню только в терминах до этого.

Первичные числа этого выражения являются постоянными 1 и переменные a, b, c а также d, У нас также есть ряд операторов +, ** а также *,

Все основные цвета являются выражениями уровня 1, и поскольку здесь нет определенного унарного оператора, мы перейдем непосредственно к выражениям уровня 2.

Выражение уровня 2 определяется правилами (цитирование F2008 7.1.2.4):

  • мульти-операнд - уровень-1-expr [мощный операнд]
  • add-operand - это [ add-operand mult-op ] мульти-операнд
  • level-2-expr - это [ [ level-2-expr ] add-op ] add-операнд

где 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),

For illustrate (no HTML in comments).

Fortran: 3**j**a**1 === Math: 3ja1 1+a*b**c*c**d === 1 + a×bc×cd

Другие вопросы по тегам