Размещение скобок в Lua (Порядок операций)

#lua

Вопрос:

Я пытаюсь выяснить порядок операций в приведенных ниже формулах.

Я использую этот скрипт для вычисления и отображения результата того, сколько денег выросло на 1000 евро за три года с 5-процентной процентной ставкой.

p-это банковская процентная ставка в процентах в год. A-начальная сумма. n — это количество лет.

 p = 5
A = 1000
n = 3
 

Является ли это наиболее правильным способом сделать это в соответствии с математикой? Насколько я понимаю, сначала он делит p / 100, затем добавляет 1, затем увеличивает в геометрической прогрессии ^ n и, наконец, умножает все на *.

 my_version = (A * ((1   (p / 100)) ^ n))
print(my_version)
 

Версия учителя:

 teachers_version = A * ((1   p / 100) ^ n)
print(teachers_version)
 

Другая версия (Как я могу быть уверен, что она просто не добавляет 1 к p, а затем не делит его на 100? Ну, я знаю, что это не так, потому что я пробовал, но в будущем или с другими математическими проблемами я просто хочу понять, как компьютер решает эту проблему):

 other_version = A * (1   p / 100) ^ n
print(other_version)
 

Или компьютер просто знает порядок операций?

Выходные данные каждого скрипта одинаковы: 1157.625

Ответ №1:

Справочное руководство Lua 5.4 перечисляет приоритет операторов в главе 3.4.8

Приоритет оператора в Lua соответствует таблице ниже, от более низкого до более высокого приоритета:

  or
 and
 <     >     <=    >=    ~=    ==
 |
 ~
 amp;
 <<    >>
 ..
       -
 *     /     //    %
 unary operators (not   #     -     ~)
 ^
 

Как обычно, вы можете использовать круглые скобки для изменения прецедентов
выражения. Операторы конкатенации («..») и возведения в степень ( » ^ » )
являются правильными ассоциативными. Все остальные двоичные операторы остаются
ассоциативными.

Левая ассоциативная означает , что A B C оценивается как (A B) C , так слева направо. ^ является правильным ассоциативным, поэтому в (A B)^(C D) Lua сначала оценит C D . Ассоциативность оператора помогает вам определить, в каком порядке оценивать выражения с несколькими операторами одинакового приоритета. Они находятся в одной строке таблицы приоритетов.

Видишь https://en.wikipedia.org/wiki/Order_of_operations

Выражения Lua, такие как teachers_version = A * ((1 p / 100) ^ n) , всегда оцениваются в соответствии с этими правилами. Круглые скобки изменят этот порядок, поскольку они будут оцениваться изнутри.

Так что мы можем разделить это на

 local x = 1   p / 100
local y = x^n
teachers_version = A * y
 

/ имеет более высокий приоритет, чем поэтому мы делим p на 100 , прежде чем добавлять его к «1».

Ваша версия:

 version = (A * ((1   (p / 100)) ^ n))
 

Внешние скобки излишни. Они не действуют, так что вы можете оставить их в покое.

 version = A * (1   (p / 100)) ^ n)
 

Скобки вокруг p/100 также излишни. / имеет более высокий приоритет, чем поэтому вам не нужно, чтобы они сообщали компьютеру об этом в первую очередь.

 version = A * (1   p / 100) ^ n
 

Это оставляет вас с вашей третьей версией. Вам нужен этот набор скобок, чтобы сообщить компьютеру, что он должен 1 p / 100 увеличивать экспоненту, n как это было бы в противном 100^n случае, из-за более высокого приоритета ^ over / .

В версии для учителей есть лишняя пара скобок. Внешние скобки здесь не нужны.

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

Комментарии:

1. Очень признателен!

Ответ №2:

Лучший способ убедиться в этом-добавить в закладки порядок приоритета операторов Lua и проверять его при необходимости.