Фортран порядок операций для показателей
Я перевожу некоторый Фортран на 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