GOLD
GOLD личный блог
21 мая 2021, 19:00

Косяк в LUA

Цикл:

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
54 Комментария
  • Никто
    21 мая 2021, 19:06
    Как битовые флаги проверять правильно покупка продажа ,? версий много а уверенности в правильности нет.
  • Никто
    21 мая 2021, 19:09
    А по коду что то не правильно в нем, чудес не бывает полагаю
  • Asakul Rurikovich
    21 мая 2021, 19:20
    Сдается мне, здесь проблема в точности представления чисел в IEEE-754, а не в lua.
      • Роджер (веселый).
        21 мая 2021, 21:05
        $100, вы кто по образованию?

          • Роджер (веселый).
            21 мая 2021, 21:18
            $100, лучше в  программирование при выборе условий пользоваться допусками, а равно, неравно применять к переменным bool, int, nil.
      • Роджер (веселый).
        21 мая 2021, 21:10
        $100, вот я по образованию инженер, и вот если я сделаю чертеж к примеру закажу у токаря выточить цилиндр диаметром 10 то он меня пошлет на три буквы и обзовет дебилом. всегда есть допуски шероховатости и конусности. И без них мой чертеж для него ничто. Он не сможет выточить цилиндр ровно 10, всегда будут отклонения и моя задача задать эти отклонения. 
      • Asakul Rurikovich
        21 мая 2021, 22:21
        $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

        Надеюсь, понятно объяснил.
  • 3Qu
    21 мая 2021, 19:23
    Для начала, Р.Иерузалимски. Программирование на языке Луа, а потом уже претензии.)
    • Никто
      21 мая 2021, 19:26
      3Qu, это надо быть неким хоть отчасти талантом чтоб ее поднять и не забывать тут же, ну во всяком случае не подготовленному.
      • 3Qu
        21 мая 2021, 19:29
        the Rolling Stones, да, ладно, язык как и все прочие. Достаточно несколько вечеров.
        • Никто
          21 мая 2021, 19:34
          3Qu, нет ну кто разбирается конечно. А вот так со стороны сесть и читать огромную книгу, где то в гугл книгах, нет даже не брался. Полно где более кратко есть, По моему чем пользоваться не много во всяком случае.
          • 3Qu
            21 мая 2021, 19:36
            the Rolling Stones, да, она совсем небольшая. Тоненькая такая книжонка.
            Сам язык вообще немного. В основном C-API, что многим вообще не надо.
            • Никто
              21 мая 2021, 19:51
              3Qu, кто тут выкладывал изящные код на луа, подсчет объемов, в квадратных скобочках, так и не понял их, скопировал, ниче так, рисуют.
            • Никто
              21 мая 2021, 19:56
              3Qu, а стоит если на бумаге тыщи две небось, на бумаге и я бы почитал, да не ясно эти две тыщи отобьешь от прочтения образно
              • 3Qu
                21 мая 2021, 19:57
                the Rolling Stones, в инете pdf свободно. Планшет, и лежа на мягком диване, для лучшего сна.)
  • Ching Chong
    21 мая 2021, 19:24
    Виноват не Lua, а представление чисел с плавающей точкой (гуглите стандарт IEEE 754). Так, согласно нему, например, 0.1 + 0.2 = 0.30000000000000004 (можете проверить в любом языке программирования, который использует IEEE 754).
    • Никто
      21 мая 2021, 19:28
      Ching Chong, не уводите в сторону в дебри, вот для трейдинга это ни к чему,
      • Beach Bunny
        21 мая 2021, 19:30
        the Rolling Stones, правильно, тогда ВПЕРЕД! Больше жёгова!
        • Никто
          21 мая 2021, 19:41
          Sergeyka, еще коды аски предложите освоить чтоб цикл в луа запустить из пяти строчек,. На трейдингвью паинт кстати они по умолчанию, даже знать об них не надо.
    • Beach Bunny
      21 мая 2021, 21:33
      Ching Chong, они еще много чего не знают кроме этого. Люди просто базовых вещей не знают, а потом удивляются, а чё оно так работает то.
  • Beach Bunny
    21 мая 2021, 19:24
    Это не косяк в Lua. Это ожидаемое поведение, если вы это не понимаете, то вам еще рано писать роботов не только на Lua, но и на других языках.
  • Роджер (веселый).
    21 мая 2021, 19:46
    лучше избегать в задание циклов дробных чисел, а использовать int. Иначе нужно точно знать кодирование (двоичное представление) дробных чисел. А так получается топик иллюстрирующий глупость с серьезным лицом.
    • 3Qu
      21 мая 2021, 19:56
      Роджер (веселый)., не надо избегать.) Перебор несколько по другому пишется.
      • Никто
        21 мая 2021, 19:58
        3Qu, ) так что не я один тут тупица в программировании, но хоть без умной физы.
        • 3Qu
          21 мая 2021, 20:02
          the Rolling Stones, тут особо и нет программистов. Просто программирование сейчас, это как раньше логарифмическая линейка, в профессионализме для логарифмической линейки нужды не было.)
          • Никто
            21 мая 2021, 20:08
            3Qu, ни фига себе линейка, так и линейка то эта не каждому дано освоить, предложить олигарху, ни в жизнь не разберется, если да то пожалуй зауважаю. Нет уж не пребедняйте таланты,
      • Роджер (веселый).
        21 мая 2021, 19:59
        3Qu, перебор, это ведь массив или структура, а у автора просто цикл.
      • Роджер (веселый).
        21 мая 2021, 20:26
        $100, возможность для тех, кто понимает как будет закодировано это число. 
      • Beach Bunny
        21 мая 2021, 21:38
        $100, лучше избегать продаж опционов, иначе можно задолжать денег больше чем у тебя есть! Накуя тогда биржа разрешает продажи опционов?
  • Роджер (веселый).
    21 мая 2021, 19:57
    LUA это язык даже не компилируемый а интерпретируемый, вот автору нужно что бы не доверять свои деньги непонятному для него языку, начать с ассемблера и прямых команд на процессор. Вот тогда будет у него веселая жизнь, сможет полностью разобраться в работе компьютера и двоичной алгебре, и никогда больше не напишет глупости. LUA это язык для бездельников, которые понимают простые истины программирования, но не хотят долго заморачиваться для написания скрипта в приложении. Очень быстро и просто.
    • 3Qu
      21 мая 2021, 20:06
      Роджер (веселый)., людей не пугайте.)
  • Андрей К
    21 мая 2021, 20:13
    поэтому сама биржа в таком виде с дробными числами не работает. Вообще опасно везде так с дробными числами работать, где идет возня с деньгами
    • Роджер (веселый).
      21 мая 2021, 20:38
      $100, Я тоже не профессиональный программист, этим деньги не зарабатываю, энтузиаст любитель. Просто топик вызывающий, типа — «какой плохой этот молоток, хотел забить гвоздь, а ударил по пальцу, ужас! Интересно что от него еще можно ждать»)). 
       Вы ведь не спросили в чем прикол такого исполнения, а поспешили определить молоток LUA.
        • Роджер (веселый).
          21 мая 2021, 20:57
          $100, ну по сути он упрощает жизнь не заставляет вас для работы вашей программы самому резервировать память и назначать тип переменных, а делает это самостоятельно и так же самостоятельно представляет числа. Не делайте дроби и будет число представлено просто int, и простейшая арифметика будет выполняться. Это ведь только инструмент помочь рассчитать просто и быстро. 
           Я же говорю язык для бездельников. В классическом языке вы еще для каждой переменной обозначите ее тип.
        • Beach Bunny
          21 мая 2021, 21:47
          $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
  • kachanov
    21 мая 2021, 20:44
    Причем тут LUA
    Сходное поведение подобной «программы» будет в большинстве языков программирования.

    А тому, кто циклу с дробными числами доверяет деньги можно грамоту выдать за отвагу.
      • kachanov
        21 мая 2021, 21:07
        $100, нет, не кажется
        Цикл с числом типа double доступен в любом языке программирования.
        Не вижу причин, почему в LUA должно быть иначе

        Для чего он нужен? Ну, вероятно, именно для этого — непредсказуемость количества шагов цикла.
          • kachanov
            21 мая 2021, 21:38
            $100, непонятно, чем может помочь объявление типа переменной, поскольку в любом языке 0.1 будет иметь тип double (хотя конечно возможны вариации в плане точности)

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

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

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

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

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

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн