Приоритет оператора 'pow' и 'root' - PullRequest
0 голосов
/ 12 августа 2010

Я пишу небольшой домашний калькулятор для целых чисел, и он включает в себя два бинарных оператора: «pow» и «root».Оператор 'pow' вычисляет (левый операнд) ^ (правый операнд), а оператор 'root' находит наибольшее число n, такое что n ^ (левый операнд) <= (правый операнд). </p>

Предполагаяне абсурдно, каким должен быть приоритет этих операторов?В настоящее время у меня их одинаковый приоритет, поэтому строки типа

3 root 1500 pow 7

оцениваются слева направо.Это правильно?Должен ли я поставить этот вопрос на mathoverflow?

Ответы [ 4 ]

4 голосов
/ 12 августа 2010

pow и root по сути одна и та же операция, выраженная по-разному (аналогично двоичным + и -). То есть sqrt(a) - это то же самое, что и pow(a, 0.5), точно так же, как a + b - это то же самое, что и a - (-b) Поэтому я бы сказал, что они должны иметь одинаковый приоритет и, следовательно, должны оцениваться слева направо.

3 голосов
/ 12 августа 2010

В большинстве других языков возведение в степень идет справа налево. Это потому, что (a ^ b) ^ c = a ^ (b * c)! = A ^ (b ^ c). См., Например, раздел для оператора power в Python (раздел 5.4)

1 голос
/ 12 августа 2010

В данном конкретном случае предпочтение кажется нормальным - у вас будут проблемы с ассоциативностью, которые в некоторых случаях могут выступать в качестве эквивалента приоритета.Причина в том, что вы сделали обратные аргументы для корня по сравнению с pow, который мы склонны рассматривать как «естественный» порядок - левый аргумент зависит от действия правого аргумента, а корень yuour на самом деле просто pow до 1 / y.

Итак, вам может потребоваться немного поэкспериментировать с более сложными выражениями, такими как A root B root C pow D root G и т. Д. И OTOH будет намного лучше, если вы сохраните аргументы для root в том же порядке, что и pow.

1 голос
/ 12 августа 2010

pow и root математически имеют одинаковый приоритет, как вы можете видеть здесь :

Стандартный порядок операций или приоритет выражен в следующей таблице.

  • показатели и корни
  • умножение и деление
  • сложение и вычитание

Как говорили другие

3 root 1500 = 1500 pow (1/3)

Поэтому они являются обратными функциями.Обратные функции имеют одинаковый приоритет.

Порядок ваших операндов также довольно необычен.Я бы предпочел, чтобы 1500 root 3 было наибольшим целым числом <= кубический корень из 1500. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...