cj ayho 0 Опубликовано 3 Февраля 2012 (изменено) Я вот с такой странностью столкнулся (правда не в сталкере, а в интерпретаторе луа версии 5.0.3. Вот имеется тупейший код для округления, но работающий только с положительными числами: function math_round( roundIn , roundDig ) -- первый аргумент - число которое надо округлить, второй аргумент - количество символов после запятой. local mul = math.pow( 10, roundDig ) return ( math.floor( ( roundIn * mul ) + 0.5 )/mul ) end Теперь вызываем этот код не только для положительных чисел но и для отрицательных: local digit = 1.23456789 print( math_round( digit, 0 ) ) print( math_round( digit, 1 ) ) print( math_round( digit, 2 ) ) print( math_round( digit, 3 ) ) print( math_round( digit, 4 ) ) print( math_round( digit, 5 ) ) print( math_round( -digit, 0 ) ) print( math_round( -digit, 1 ) ) print( math_round( -digit, 2 ) ) print( math_round( -digit, 3 ) ) print( math_round( -digit, 4 ) ) print( math_round( -digit, 5 ) ) А теперь смотрим вывод и выпадаем в осадок: user@cjayho:~/Desktop$ lua ./22.lua 1 1.2 1.23 1.235 1.2346 1.23457 -1 -1.2 -1.23 -1.235 -1.2346 -1.23457 То есть несмотря на то, что код работает с отрицательными числами некорректно, при выполнении кода получаются корректные результаты. Вот у меня и вопрос - wtf o_O? Изменено 3 Февраля 2012 пользователем cj ayho Поделиться этим сообщением Ссылка на сообщение
cj ayho 0 Опубликовано 3 Февраля 2012 (изменено) abramcumner Багодарю вас тащь капитан. А прибавление 0,5 к первому аргументу вас не смущает? Изменено 4 Февраля 2012 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
cj ayho 0 Опубликовано 3 Февраля 2012 (изменено) abramcumner В общем мнение ваше я понял. Теперь же хочу выслушать мнение людей, которые в теме математики и программирования. Изменено 4 Февраля 2012 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
cj ayho 0 Опубликовано 4 Февраля 2012 (изменено) Ну я думаю не стОит объяснять как происходит алгоритм округления. Например если округляем до сотых и в тысячных получается 5 и более, то к сотым при округлении добавляется единица. Так вот, использованный мною алгоритм (кнутовский кстати) с положительными числами работает как нужно, но следуя логике алгоритма он не должен работать с отрицательными числами. Хотя при реализации в луа работает. Вот я и спросил - почему. Если я конечно корректно определил что math.floor просто отбрасывает числа после запятой. Изменено 4 Февраля 2012 пользователем cj ayho Поделиться этим сообщением Ссылка на сообщение
cj ayho 0 Опубликовано 4 Февраля 2012 malandrinus, хм вот оно как. я просто оказывается при имплементации не ту ф-цию применил. Спасибо за информацию. Поделиться этим сообщением Ссылка на сообщение