#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 и проверять его при необходимости.