Блог им. FineLogin

Косяк в LUA

    • 21 мая 2021, 19:00
    • |
    • GOLD
      Популярный автор
  • Еще
Цикл:

for i = 0.1, 0.3, 0.1 do
    message(tostring(i))
end
Результат:

0.1
0.2


Цикл:

for i = 0.1, 0.5, 0.1 do
    message(tostring(i))
end
Результат:

0.1
0.2
0.3
0.4
0.5

Забавно да?

А я этому LUA доверяю свои деньги! Кто знает, где у него еще косяки зарыты...

----------------------------------------
QUIK 8.13.1.16 / LUA 5.3.5 и 5.4.1
  • обсудить на форуме:
  • Quik Lua
★1
54 комментария
Как битовые флаги проверять правильно покупка продажа ,? версий много а уверенности в правильности нет.
avatar
А по коду что то не правильно в нем, чудес не бывает полагаю
avatar
Сдается мне, здесь проблема в точности представления чисел в IEEE-754, а не в lua.
Asakul Rurikovich, косяк LUA в том, что в нем нет возможности декларировать типы числовых переменных((

операции с десятичными числами активно используются не только в циклах… например, код LUA:

local a, b = 0.1, 0.2
if a + b ~= 0.3 then
  message(«Fuck»)
end

возвращает:

Fuck

… напороться на эту херню можно в любой момент… а это, блть, ни в какие ворота))

avatar
$100, вы кто по образованию?

Роджер (веселый)., образование отняло у меня 16 лет жизни и не дало почти ничего… не хочу вспоминать об этом)
avatar
$100, лучше в  программирование при выборе условий пользоваться допусками, а равно, неравно применять к переменным bool, int, nil.
$100, вот я по образованию инженер, и вот если я сделаю чертеж к примеру закажу у токаря выточить цилиндр диаметром 10 то он меня пошлет на три буквы и обзовет дебилом. всегда есть допуски шероховатости и конусности. И без них мой чертеж для него ничто. Он не сможет выточить цилиндр ровно 10, всегда будут отклонения и моя задача задать эти отклонения. 
$100, да, но здесь дело не в lua, то же самое будет в javascript, c++,  в любом современном языке числа с плавающей точкой хранятся в IEEE-754.
К сожалению, в этом формате многие числа не могут быть представлены точно. В частности, ниже в этом треде Вам уже указали, что в IEEE-754 число 0.3 «округляется» до 0.30000000000000004.<br />Как быть? Если точность важна, то не следует использовать числа с плавающей точкой =). Ваши примеры следует переписать в виде:
for i = 1, 3, 1 do
    message(tostring(i))
end
и
local a, b = 1, 2
if a + b ~= 3 then
  message(«Fuck»)
end

Надеюсь, понятно объяснил.
Для начала, Р.Иерузалимски. Программирование на языке Луа, а потом уже претензии.)
avatar
3Qu, это надо быть неким хоть отчасти талантом чтоб ее поднять и не забывать тут же, ну во всяком случае не подготовленному.
avatar
the Rolling Stones, да, ладно, язык как и все прочие. Достаточно несколько вечеров.
avatar
3Qu, нет ну кто разбирается конечно. А вот так со стороны сесть и читать огромную книгу, где то в гугл книгах, нет даже не брался. Полно где более кратко есть, По моему чем пользоваться не много во всяком случае.
avatar
the Rolling Stones, да, она совсем небольшая. Тоненькая такая книжонка.
Сам язык вообще немного. В основном C-API, что многим вообще не надо.
avatar
3Qu, кто тут выкладывал изящные код на луа, подсчет объемов, в квадратных скобочках, так и не понял их, скопировал, ниче так, рисуют.
avatar
3Qu, а стоит если на бумаге тыщи две небось, на бумаге и я бы почитал, да не ясно эти две тыщи отобьешь от прочтения образно
avatar
the Rolling Stones, в инете pdf свободно. Планшет, и лежа на мягком диване, для лучшего сна.)
avatar
Виноват не Lua, а представление чисел с плавающей точкой (гуглите стандарт IEEE 754). Так, согласно нему, например, 0.1 + 0.2 = 0.30000000000000004 (можете проверить в любом языке программирования, который использует IEEE 754).
avatar
Ching Chong, не уводите в сторону в дебри, вот для трейдинга это ни к чему,
avatar
the Rolling Stones, правильно, тогда ВПЕРЕД! Больше жёгова!
avatar
Sergeyka, еще коды аски предложите освоить чтоб цикл в луа запустить из пяти строчек,. На трейдингвью паинт кстати они по умолчанию, даже знать об них не надо.
avatar
Ching Chong, яж говорю… забавно))

 

avatar
Ching Chong, они еще много чего не знают кроме этого. Люди просто базовых вещей не знают, а потом удивляются, а чё оно так работает то.
avatar
Это не косяк в Lua. Это ожидаемое поведение, если вы это не понимаете, то вам еще рано писать роботов не только на Lua, но и на других языках.
avatar
Sergeyka, идите-ка вы накуй с такими комментами))
avatar
лучше избегать в задание циклов дробных чисел, а использовать int. Иначе нужно точно знать кодирование (двоичное представление) дробных чисел. А так получается топик иллюстрирующий глупость с серьезным лицом.
Роджер (веселый)., не надо избегать.) Перебор несколько по другому пишется.
avatar
3Qu, ) так что не я один тут тупица в программировании, но хоть без умной физы.
avatar
the Rolling Stones, тут особо и нет программистов. Просто программирование сейчас, это как раньше логарифмическая линейка, в профессионализме для логарифмической линейки нужды не было.)
avatar
3Qu, ни фига себе линейка, так и линейка то эта не каждому дано освоить, предложить олигарху, ни в жизнь не разберется, если да то пожалуй зауважаю. Нет уж не пребедняйте таланты,
avatar
3Qu, перебор, это ведь массив или структура, а у автора просто цикл.
Роджер (веселый)., то значит «лучше избегать»?))… накуя тогда сделали такую возможность?

и чего чего еще «лучше избегать»?))
avatar
$100, возможность для тех, кто понимает как будет закодировано это число. 
Роджер (веселый)., ааа… типа для самых умных задротов?))
avatar
$100, ну вот вы уже разобрались, можете пользоваться. ) 
$100, лучше избегать продаж опционов, иначе можно задолжать денег больше чем у тебя есть! Накуя тогда биржа разрешает продажи опционов?
avatar
LUA это язык даже не компилируемый а интерпретируемый, вот автору нужно что бы не доверять свои деньги непонятному для него языку, начать с ассемблера и прямых команд на процессор. Вот тогда будет у него веселая жизнь, сможет полностью разобраться в работе компьютера и двоичной алгебре, и никогда больше не напишет глупости. LUA это язык для бездельников, которые понимают простые истины программирования, но не хотят долго заморачиваться для написания скрипта в приложении. Очень быстро и просто.
Роджер (веселый)., людей не пугайте.)
avatar
Роджер (веселый)., пока был молод, писал на ассемблере… и чо?.. яж не мудак какой писать сейчас на нем))
avatar
поэтому сама биржа в таком виде с дробными числами не работает. Вообще опасно везде так с дробными числами работать, где идет возня с деньгами
avatar
Андрей К, опасно писать кривенький интерпретатор, за который могут по роже надавать))
avatar
Терпеть не могу программистов. Сидят, блть, строят из себя умников. Ваще не мужики))
avatar
$100, Я тоже не профессиональный программист, этим деньги не зарабатываю, энтузиаст любитель. Просто топик вызывающий, типа — «какой плохой этот молоток, хотел забить гвоздь, а ударил по пальцу, ужас! Интересно что от него еще можно ждать»)). 
 Вы ведь не спросили в чем прикол такого исполнения, а поспешили определить молоток LUA.
Роджер (веселый)., интерпретатор не дает возможности декларировать тип переменной, используемой в цикле, но дает возможность запустить цикл с десятичным числом… это ли не косяк?))
avatar
$100, ну по сути он упрощает жизнь не заставляет вас для работы вашей программы самому резервировать память и назначать тип переменных, а делает это самостоятельно и так же самостоятельно представляет числа. Не делайте дроби и будет число представлено просто int, и простейшая арифметика будет выполняться. Это ведь только инструмент помочь рассчитать просто и быстро. 
 Я же говорю язык для бездельников. В классическом языке вы еще для каждой переменной обозначите ее тип.
$100, для «особо непонятливых» есть документация в которой написано

The number type represents real (double-precision floating-point) numbers. Lua has no integer type, as it does not need it.
www.lua.org/pil/2.3.html
avatar
Причем тут LUA
Сходное поведение подобной «программы» будет в большинстве языков программирования.

А тому, кто циклу с дробными числами доверяет деньги можно грамоту выдать за отвагу.
avatar
kachanov, а зачем тогда делать реализацию цикла с десятичным числом в языке, не предоставляющем возможность декларировать тип переменной, используемой в цикле?

вам это не кажется странным?.. нет?.. почему?
avatar
$100, нет, не кажется
Цикл с числом типа double доступен в любом языке программирования.
Не вижу причин, почему в LUA должно быть иначе

Для чего он нужен? Ну, вероятно, именно для этого — непредсказуемость количества шагов цикла.
avatar
kachanov, да дело вообще не в циклах...

если нет возможности декларировать тип числовой переменной, то получается такое:

0.1 + 0.2 не равно 0.3

0.15 + 0.15 равно 0.3

… и такое может случиться в любом месте алгоритма
avatar
$100, непонятно, чем может помочь объявление типа переменной, поскольку в любом языке 0.1 будет иметь тип double (хотя конечно возможны вариации в плане точности)

И в любом языке никто не гарантирует, что 
0.1+0.1+0.1 = 0.3

Это особенность представления чисел с плавающей точкой.
И она справедлива для всех языков. И связана она с двоичным представлением числа в памяти компьютера, а не чьим-то злым умыслом.

Просто следует учитывать это в своих программах. Еще раз подчеркну, в программах на любом языке.
avatar
$100, 
вы какой тип хотите декларировать?
Прекрасный тип который умеет представлять числа с дробной частью без ошибок округления?

Не завезли такие в большинство языков. Вы тот же результат что и в Lua получите в C, C++, C#, Java, JS и так далее.
$100, и это нормально для double типа и все об этом знают.
Не нравится пишишь(или используешь готовую) реализацию типа decimal  и пользуешься
avatar
напиши
for i = 0.1, 0.31, 0.1 do
    message(tostring(i))
end

и у тебя будет толеранс
avatar

теги блога GOLD

....все тэги



UPDONW
Новый дизайн