Lua: Каков типичный подход для использования вычисленных значений в цикле for? - PullRequest
0 голосов
/ 26 августа 2018

Каков типичный подход в LUA (до введения целых чисел в 5.3 ) для работы с вычисленными значениями диапазона в циклах for? Математические вычисления начальных и конечных значений в числовом цикле для цикла подвергают код риску ошибок, возможно, неприятных скрытых, так как это будет происходить только для определенных значений и / или с изменениями порядка вычислений. Вот придуманный пример цикла, который не выдает желаемого результата:

a={"a","b","c","d","e"}
maybethree = 3 
maybethree = maybethree / 94
maybethree = maybethree * 94
for i = 1,maybethree do print(a[i]) end

В результате получается несостоявшийся вывод двух элементов, а не желаемых трех (протестировано на 5.1.4 на 64-битной x86):

a
b

Программисты, незнакомые с этой территорией, могут быть еще более сбиты с толку выводом print () , который печатает 3!

Здесь может работать применение функции округления до ближайшего целого числа. Я понимаю приближение с FP и почему это не помогает, меня интересует, какой типичный стиль / решение для этого в LUA.

Похожие вопросы:

1 Ответ

0 голосов
/ 26 августа 2018

Решение состоит в том, чтобы избежать этой зависимости от математики с плавающей точкой, где точность с плавающей точкой может стать проблемой.Или, более реалистично, просто помните, когда вы используете FP, и помните о точности.Это не проблема Lua, которая требует решения, специфичного для Lua.

maybethree является неправильным: это никогда три.Ваш код выше является детерминированным.Он всегда будет печатать только a и b.Поскольку переменная maybethree меньше трех, конечно, цикл for не будет выполняться 3 раза.

Функция print также ведет себя так, как определено / ожидается.Используйте string.format, чтобы показать номер FP во всем его великолепии:

print(string.format("%1.16f", maybethree)) -- 2.9999999999999996

Все еще нужно использовать вычисленные значения для управления вашей петлей for?Тогда вы уже упомянули ответ: реализовать функцию округления.

...