1. JavaScript / Говнокод #27886

    −7

    1. 1
    2. 2
    3. 3
    let x = 0.1;
    let y = 0.2;
    let z = x + y

    чему равно?

    Запостил: ASD_77, 21 Декабря 2021

    Комментарии (68) RSS

    • Кампутерный учоный штоли?
      Ответить
    • Во валит, гад
      Ответить
    • Старый багор плавающего питуха
      Ответить
      • Да ну, ASD_77 знает, что про этот багор тут все знают. Наверно похитрее баг.

        Или вообще мелкие числа, у которых мантисса помещается в инт, он загоняет в инт, эмулируя фиксированного питуха в десятичной системе. Т.е. скажем, 1234.5 представляется как int (1234.5 * 10000).
        Ответить
        • хорошо как пофиксить этот баг?
          Ответить
          • Смешите видеть как тупоскриптеры изобретают int.
            Сначала линкер, теперь блять до intа докатились!

            https://spin.atomicobject.com/2018/11/05/using-an-int-type-in-typescript/
            Ответить
            • Современное программирование всё больше напоминает мне домик из волос и жвательной резинки, который пытаются укрепить с помощью карандашей, яблок и банановой кожуры, чтобы использовать его как стремянку
              Ответить
              • которая нужна, чтобы добраться до циферблата старых атомных часов и переписать его на раст
                Ответить
          • * использовать десятичные плавающие числа
            * использовать дроби
            * использовать символьные вычисления
            * оставить как есть
            Ответить
            • * использовать язык где type что-то означает, а не просто вынесен в название
              * использовать язык для белых

              <?php
              
              $d = [0.3 => 'hello'];
              echo $d[0.1 + 0.2];
              
              
              https://ideone.com/Hi7g6m
              Ответить
              • Причём тут type? "let" - синоним "decimal float", но внутри реализован как "binary float"?
                Ответить
                • > Причём тут type?
                  Язык называется typeScript.

                  Казалось бы причём здесь типы?
                  Ответить
              • Chrome, Firefox*, Edge*:
                (0.1+0.2).toLocaleString()
                '0,3'
                (0.1+0.2).toString()
                '0.30000000000000004'

                Да, багор )))

                Интересно, если поставить американскую локаль, а потом вызвать toLocaleString, а потом кастануть к Number, будет 0.3?
                ________
                * А что, они уже все хромые? Девтулы выглядят так же с точностью до вида иконок и подсказывают результат так же
                Ответить
                • > если поставить американскую локаль
                  Всегда так делаю.

                  > а потом вызвать toLocaleString, а потом кастануть к Number, будет 0.3?
                  Да
                  (0.1+0.2).toLocaleString()
                  "0.3"
                  
                  +((0.1+0.2).toLocaleString())
                  0.3
                  Ответить
                  • Надо в исходном коде выставлять - чтобы кросспитушня была, а не только у американцев, иноагентов и ПИ работало.
                    Ответить
                • new Intl.NumberFormat('en-US').format(0.1+0.2)
                  '0.3'


                  Шах и мат, PHP!

                  var d = {0.3: 'hello'};
                  alert(d[new Intl.NumberFormat('en-US').format(0.1+0.2)]);

                  Заметим, что и по типам тут лучше. В [...] передаётся String - как и планировалось в ECMAScript.
                  Ответить
                  • (0.1+0.2).toLocaleString('en-RU')

                    А такое в виндах работает?
                    Ответить
                    • Работает. Выдаёт то же, что и (0.1+0.2).toLocaleString('en'), (0.1+0.2).toLocaleString('en-UK'), (0.1+0.2).toLocaleString('en-US')
                      Ответить
                      • По-моему оно вообще только на префикс en смотрит.

                        >Шах и мат, PHP!
                        Говно какое-то трёхразрядное.
                        ((0.1234+0.4321).toLocaleString('en'))
                        "0.556"


                        Upd: можно так
                        (0.1234+0.4321).toLocaleString('en',{minimumFractionDigits: 1, maximumFractionDigits: 10})
                        Ответить
                        • А если не "en", то будет без округления? Или просто с запятой вместо точки?
                          Ответить
                        • Параметры во втором аргументе некроссбузерные, кажется. Можно схватить багор в каком-нибудь движке.
                          Ответить
                          • Да, действительно. В божественном 5.1

                            Number.prototype.toLocaleString()
                            
                            Produces a String value that represents this Number value formatted according to the conventions of the host environment’s current locale. This function is implementation-dependent, and it is permissible, but not encouraged, for it to return the same thing as toString.
                            
                            NOTE The first parameter to this function is likely to be used in a future version of this standard; it is recommended that implementations do not use this parameter position for anything else.

                            В версии 2022 года уже так:
                            https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.prototype.tolocalestring

                            21.1.3.4 Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )
                            
                            An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the 
                            Number.prototype.toLocaleString method as specified in the ECMA-402 specification. 
                            If an ECMAScript implementation does not include the ECMA-402 API the 
                            following specification of the toLocaleString method is used.
                            
                            Produces a String value that represents this Number value formatted according 
                            to the conventions of the host environment's current locale.
                            This function is implementation-defined, and it is permissible, 
                            but not encouraged, for it to return the same thing as toString.
                            
                            The meanings of the optional parameters to this method are defined in the ECMA-402 specification;
                            implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
                            Ответить
                            • >An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the
                              >Number.prototype.toLocaleString method as specified in the ECMA-402 specification.

                              А вот что говорит по этому поводу ECMA-402

                              18.2.1 Number.prototype.toLocaleString ( [ locales [ , options ] ] )
                              
                              This definition supersedes the definition provided in ES2021, 20.1.3.4. 
                              
                              The options properties "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", and "maximumSignificantDigits"
                              in the NumberFormat constructor, provided that the additional values are interpreted as integer values higher than the specified limits.
                              
                              https://402.ecma-international.org/8.0/
                              Ответить
                          • Пусть оно и в теории будет работать я согласен что это toLocaleString говно какое-то ньюскульное, анскильное и локалезависимое.

                            Поскольку в божественном 5.1 этого не было. А все что дальше эти все раздутые ECMA-402 это ересь и питушня.

                            Зато в 5.1 есть toPrecision.

                            https://262.ecma-international.org/5.1/#sec-15.7.4.7

                            Выходит гораздо чище и работает даже в IE6.
                            +((0.1+0.2).toPrecision(10))
                            Ответить
                            • Если пишешь для Ноды, то можно и ньюскульное использовать. А если для браузера, то можно обосраться в каком-нибудь Сафари, и маководы уйдут.
                              Ответить
                            • > раздутые ECMA-402 это ересь и питушня
                              Стандарт крестов ECMAScript'а не мог становиться ещё толще и вытекал из треда ECMA-262.
                              Ответить
                • > если поставить американскую локаль

                  А если просто передать её аргументом?
                  +((0.1+0.2).toLocaleString('en-UK'))
                  Ответить
                  • Да, это идеальный вариант.
                    Я не подумал про возможность педерачи аргумента, пошёл гуглить локалепитушню.
                    Ответить
    • Наверно C:\dev\TypeScriptCompiler\__build\tsc\bi n\tsc.exe говорит "пшол вон, ошибка конпеляции: нет сёмы-колона"?

      P.S. Поздравляю с сотым говнокодом!
      Ответить
    • 10 LET x=0.1
      20 LET y=0.2
      30 LET z=x+y
      40>PRINT "z = ";z
      Ответить
      • 50 LET MY PEOPLE$ = "GO"
        Ответить
        • let ключ слово
          и my ключ слово (в перле)
          и go ключ слово сами знаете где
          Ответить
          • Некоторые реализации Бейсика допускали пробелы в идентификаторах, если это не приводит к неоднозначности. Или это не в Бейсике было...
            Ответить
            • Spectrum BASIC, например.
              LET PEN ISLAND = 69: PRINT PENIS LAND

              (69)
              Но там, как я помню, имена массивов и строк могли состоять Толька из одной буквы.
              Ответить
        • 60 LET MY PEOPLE$ = "PHP"
          Ответить
    • будет примерно .0.3 и там еще какой-то волосок прилипнет на жопе

      Ты только сегодня узнал про IEEE 754?
      Я тебе завидую.. ты только еще в самом начале интереснейшего пути в программирование... Тебя ждет не мало радости и удивления
      Ответить
      • хорошо как пофиксить этот баг?
        Ответить
        • Переходить на "PHP".
          Ответить
        • Сравнивать примерно.

          Ну или юзать decimal'ы вместо флоатов.
          Ответить
          • Да, даже результаты некомпуктерных вычислений сравнивают с погрешностью.

            Авджрукк там не 0.1 и 0.2, Math.Pi + Math.sqrt(2)?
            Ответить
            • У децималов хотя бы нет проблемы с вводом/выводом т.к. они десятичные.
              Ответить
              • На самом деле и у питухов нет проблем с выводом
                Есть проблема с представлением их в виде десятичных дробней

                Ну так компьютер не виноват что тупые куски мяса не могут в нормальное представление.

                Если завтра прилетят инопланетяни, которые все числа представляют как степени числа 42, то ваши десятичные числа тоже соснут
                Ответить
          • Сравнивать-то можно и примерно, а вот как пользователю отображать? Если он рисует квадратик размером 0.2 на расстоянии 0.1 от края, потом к нему прислоняет кружок и видит, что у него координата какая-то 00000001.
            Ну разве что тупо округлять до 6-7 значащих цифр.
            Ответить
            • > разве что тупо округлять
              Если у тебя все позиции идут с точностью до 3 значащих цифр, значит всё, что дальше — погрешности и их можно округлять.

              А вообще в таких случаях цари не используют флоаты, а просто используют милионные? доли и для спокойствия питуха, просто ставят запятую в нужном месте.
              Ответить
            • Я в своё время писал «интеллектуальную» округлялку: в цикле пытался округлять до целых, до десятых, до сотых и так далее, сравнивая каждый округлённый вариант с оригиналом. Останавливался, когда получал приемлемую погрешность.
              Ответить
              • Вообще, если ты инженер а не программист, ты обычно знаешь погрешности входных данных. И нету никакого смысла выводить измеренную линейкой длину до миллионных долей микрона.
                Ответить
            • Отображать - в пикселях. Их пока не континуум, так что округлять придётся.
              Ну и сравнивать в некоторых случаях, по-хорошему, надо расстояния в пикселях, если уж на то пошло, чтобы меньше застревали в текстурах.
              Ответить
        • Использовать нормальный язык программирования, где целые представляются целыми
          Ответить
          • > Использовать нормальный язык программирования, где целые представляются целыми
            Э! До проблемы целых пока не дошли. Тут только проблемы нецелых обсуждаются.

            Использовать нормальный язык программирования, где все числа целые (например, Brainfuck)
            Ответить
            • Кстати, когда обычному рядовому программисту с голер может понадобица плавучка?

              графики рисовать?
              Ответить
              • Калькуляторы писать
                Ответить
              • Кучу библиотек делали ниасиляторы, которые не могли сделать как у белых людей параметр от 0 до 100 (%), а берут значение от 0.0 до 1.0
                Ответить
              • Вопрос так вопрос, лол. Вопрос "нужна ли программисту математика", возведённый почти в абсолют. Хотя, в Brainfuck нет даже сложения, не то что плавучки.
                Ответить
                • Напиши библиотеку для поддержки плавучего питуха в мозгоёбе.
                  Ответить
        • Купи себе Ma-the-ma-ti-ca'у и дёргай её из своей программы.
          https://reference.wolfram.com/language/guide/CLanguageInterface.html
          Ответить
    • https://govnokod.ru/25645
      Ответить
    • JawaScript не причём! Это всё я виноват!

      Простите меня!
      Ответить

    Добавить комментарий