Как программисты числа сломали?!

Поделиться
HTML-код
  • Опубликовано: 24 янв 2025

Комментарии • 80

  • @Howtogoit
    @Howtogoit  Год назад +1

    Тренажеры HTML Academy (HTML, CSS, JS, React) + Академия + Книга рецептов фронтендера + комьюнити
    за 99 рублей:
    boosty.to/how-to-learn-it
    Какие тренажеры бывают:
    htmlacademy.ru/courses#fe-start
    Вливайся в команду мечты:
    psb-hr@yandex.ru
    Вакансии: habr.com/ru/company/psb/vacancies/
    Мой телеграмм-канал:
    t.me/howToLearnIT
    Телеграмм-канал для любителей фронтенда:
    t.me/frontendnoteschannel
    Литература:
    habr.com/ru/post/112953/
    ruclips.net/video/PZRI1IfStY0/видео.html
    docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
    standards.ieee.org/ieee/754/4211/
    stackoverflow.com/questions/588004/is-floating-point-math-broken/588014#588014
    0:00 Дебют
    0:35 Как числа получили стандарт?
    2:57 Как хранятся в памяти числа с плавающей точкой?
    4:24 Рекламная пауза
    5:05 Сколько памяти выделяется на хранение чисел?
    9:07 И почему 0.1 + 0.2 != 0.3?
    10:25 Это фундаментальный баг?
    #it #programming

    • @PlaceTickets
      @PlaceTickets Год назад

      Вспомнил анекдот. Приходит мужик к врачу. Выворачивается, подымает ногу, закидывает руку за спину и говорит. "-Доктор когда я так делаю у меня тут хрустит". Доктор отвечает: "-А попробуйте так не делать.".
      .
      Тоже самое. Эта проблема известна всем. и ни кто не страдает. Но некоторые единицы людей даже в этом находят трагедию и снимают ролики "Кто сломал языки?".

  • @UC1C0GDMTjasAdhELHZ6lZNg
    @UC1C0GDMTjasAdhELHZ6lZNg Год назад +21

    10-ричная система плохо делится на 3 и такие же проблемы возникают, если бесконечную периодическую дробь попытаться округлить. Это просто ограничение системы счисления или математики кому как угодно.

    • @jioneg9369
      @jioneg9369 Год назад +1

      За 12-ричной системой будущее

    • @yahton309
      @yahton309 Год назад

      ​@@jioneg9369 а как делить на 5?

    • @jioneg9369
      @jioneg9369 Год назад

      @@yahton309 а как 10 делить на 6?

    • @yahton309
      @yahton309 Год назад +2

      @@jioneg9369 за 360тиричной*. Ву ней больше всего делителей.

    • @replays4026
      @replays4026 Год назад

      @@yahton309 Лучше сразу в 2310-ой

  • @_1_m
    @_1_m Год назад +2

    Вывод: программист хуже пятиклассника

  • @IT-Svyatoslav
    @IT-Svyatoslav Год назад +2

    Супер! Обожаю ваш канал за глубокие фундаментальные знания и полезные лайфхаки 😊

  • @mega_mango
    @mega_mango Год назад +2

    Кстати. На самом деле и гораздо проще можно. Те же калькуляторы у нас в телефонах хранят числа в памяти также, как их записывают классические математики. У них 5.3 записывается буквально как 53/10 (хотя и не во всех, например в моём телефоне да, а в гугловском калькуляторе или бабушкином телефоне нет). В этом есть плюс в виде отсутствия таких "парадоксов", да и по памяти на практике такие числа занимают гораздо меньше. Однако асимптотическая сложность вычислений таких чисел (именно что сложений) в разы больше (O(n²) вместо O(n), при n = длина каждого складываемого числа, насколько я помню, поправьте меня если что в комментариях если что). Из-за этого по одному месту идут все действительно крупные вычисления, и это в отличие от операций с точкой повсеместно и неисправимо (хотя неисправимо, скорее, почти. Используя некоторые математические формулы, от алгоритма Евклида, до использования обобщённой гипотезы Римана для сверхбыстрого нахождения простых сомножителей и сокращения оных можно ускорить операции с такими числами в разы. Хотя на практике это извращение и я хз кто кроме создателей специальных либ таким занимается)

  • @konstantinchernyaev3011
    @konstantinchernyaev3011 Год назад +4

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

    • @Ryhor1
      @Ryhor1 Год назад

      Указанного минуса не будет, если положение фиксированной запятой указывается сразу на целый ряд чисел. Например, как тип поля в базе данных.
      А вообще, если нужна точность, можно всё хранить как дроби двух целых чисел, числитель и знаменатель. После вычислений делать сокращение дробей, чтобы они сильно не разрастались.

  • @МихаилКрамер-н7ш
    @МихаилКрамер-н7ш Год назад +3

    Ну так мы не хуже компьютеров, от числа пи, к примеру, берём, столько, сколько нам уместно для задач брать :) Я, помню, баловался, брал число пи как 3 ровно :)) Надо было сказать, что для точных вычислений есть библиотеки, которые хранят числа в виде строк и реализуют буквально сложение/умножение столбиком

  • @2difficult2do
    @2difficult2do Год назад +1

    Хорошая подача, перезалив засчитан ;-)

  • @vladlen-krut
    @vladlen-krut Год назад

    А почему бы просто не хранить само число в исходном виде как без запятой, + ещё оффсет для этой самой запятой считая со старшего бита, а минусы хранить в старшем бите самого числа?

  • @igor-sukharev
    @igor-sukharev Год назад

    Эти неточности при мат. моделировании и расчётах играют малую роль, так как они предсказуемы, как в плане их появления, так и в плане их величины.
    У интеловского стандарта есть преимущество: для любого числа, малого или большого, хранится одинаковое количество двоичных значащих цифр. А значит, вокруг нуля малые числа находятся плотнее, чем огромные числа. Как от малого, так и от большого числа можно высчитать одну и ту же долю (например, 1%) с одинаковой относительной погрешностью.

  • @daniil2704
    @daniil2704 Год назад

    Если нужны точные вычисления, можно умножить на количество знаков после запятой, тем самым получив целое число, что то с ним сделать, а потом поделить обратно :)
    0.2 + 0.1 = 0.30000000000000004
    (0.2 * 10 + 0.1 * 10) / 10 = 0.3

  • @demimurych1
    @demimurych1 Год назад +3

    Автор видео смешал все в кучу, добавив при этом своими домыслами которые никакого отношения не имеют к JS
    00:41:00 *Большая часть скажет так исторически сложилось*
    Так скажет только та часть, которая училась по видео подобным этому. Любой студент, который учился на инфизе, даже без программирования, прекрасно знает что такое точность вычислений и какие существуют на сегодняшний момент варианты решения этой проблемы.
    Студенту второго курса инфиза, достаточно открыть спецификацию ИЕЕЕ 754 чтобы пояснить все подводные камни стандарта оперирования чисел с плавающей точкой.
    70 тые года, процессор 8087 и перепетии с интел там вообще непричем. Вы бы внимательно почитали те ссылки что сами даете. Там возня была за то, чтобы включить в стандарт дополнительный аппарат расширения точности вычислений в том случае, когда требуемая мантисса будет приводить к очень грубым округлениям.
    Никакого отношения к тому, о чем говорит автор в видео это не имеет.
    Прочтите уже сами полностью интервью Кэхана, чтобы не нести всю эту ахинею. А то происходит та же история как с утверждением что typeof null === 'object' это дескать была ошибка. Один не дочитал второй не так понял.
    Современный JS вам предоставляет BigInt тип, которого более чем достаточно для организации логики вычисления с любой точностью, которую позволит Вам обьем Вашей оперативной памяти.
    ИЕЕЕ 754 это сдантарт дефакто для работы с числами с плавающей запятой. Он закреплен стандартом, который в том числе описывает все его ограничения.
    Проблемы студентов начинаются тогда, когда они не зная математики, где проблема точности точно такая же, думают что вычислительные машины могут быть устроены иначе.

    • @mega_mango
      @mega_mango Год назад

      Так это просто новичковое видео. Если ты супер профи, то просто смотри соответствующий по сложности контент. Ещё лучше: запиши гайд лучше, чем автор.) А пока эти слова остаются лишь словами

    • @demimurych1
      @demimurych1 Год назад +2

      @@mega_mango > _то просто смотри соответствующий по сложности контент_
      Дай мне хотя бы одну ссылку на такой контент о JS?
      > _Ещё лучше: запиши гайд лучше, чем автор_
      Я провел больше 50 стримов общей сложностью больше 100 часов (на youtube канал asforjs).
      Пытаясь как раз раскрыть эти самые вопросы. Не говоря уже о том, что если бы не война, то полтора года назад, у меня должна была бы выйти книжка.

    • @dmitry4337
      @dmitry4337 Год назад +1

      я чомусь був впевнений що побачу коммент Мурича під цим відео ))

  • @max_mgtow
    @max_mgtow Год назад +1

    Привет, дружище 🤝
    Рад тебя видеть ✌️👍

    • @Howtogoit
      @Howtogoit  Год назад +1

      Привет! =) И я рад снова тебя видеть)

  • @ICC_ECHR_Request_BY_VS
    @ICC_ECHR_Request_BY_VS Год назад

    у вас 10ка... там вроде virtio для якобы безопасности используется, вы можете что нибудь подсказать по этому поводу? а то я смотрел, его патентовали для какого-то хаоса, так же смотрел это шина pci, а сейчас с высокими частотами техника, и покрывают разъемы медью, хотя раньше были из простого металла, да и каждый пятачок на креплениях в меди... А virtio используется в qemu как я понял для подключения к шинам данных тонких-толстых клиентов... и это потом называют какой-то энтропией.
    3/10 яблока и немножко энтропии

  • @VladVeninTV
    @VladVeninTV Год назад +1

    Привет, почему ты удалил свои видео с к другого канала? 🧐

    • @Howtogoit
      @Howtogoit  Год назад +1

      Возвращаюсь на старый канал просто)
      Эксперимент с новым каналом оказался не очень удачным

  • @alexandrstrekalovskiy4083
    @alexandrstrekalovskiy4083 Год назад

    Ты прекрасен!
    Лучшее объяснение, которое я когда-либо видел! Спасибо!
    Вот ток фраза в конце "из-за неточности математики" вгоняет в ступор...
    Качество шоу - супер!❤

  • @ruria_coda
    @ruria_coda Год назад +1

    if float('inf') / float('inf') = 0.0:
    print('Phew, oh, normal')
    elif float('inf') / float('inf') = nan:
    print('WTF?')

  • @MityaNamikin
    @MityaNamikin Год назад +1

    а чем 1,010(1001)×10¹⁰ лучше 110101/1010¹?

    • @drino955jug3
      @drino955jug3 Год назад

      йосип хорват? Ты не из Хорватии случаем?

    • @MityaNamikin
      @MityaNamikin Год назад

      @@drino955jug3 кто? я не из Хорватии

    • @drino955jug3
      @drino955jug3 Год назад

      @@MityaNamikin ты ник поменял или он у тебя такой и был MeeThya (Митя)? Просто у меня походу какой-то баг с ютубом был

    • @MityaNamikin
      @MityaNamikin Год назад

      @@drino955jug3 я был и есть Митя)

    • @drino955jug3
      @drino955jug3 Год назад

      @@MityaNamikin я тоже Митя кста. Ля, вот это баг.................

  • @gernet9250
    @gernet9250 Год назад

    Errortime???
    Голос очень похож...

  • @baileysli6235
    @baileysli6235 Год назад

    Мне нравился старый дизайн с героями мультиков :(
    Сейчас айдентика потерялась и глаз не цепляется в ленте

  • @НаташаНаташа-б8к

    а в vax стандарте была такая проблема ?)

  • @samolevich
    @samolevich Год назад

    Если проблема не из-за стандарта, то для чего историческая справка про борьбу стандартов?

  • @snatvb
    @snatvb Год назад

    в js используется 53 бита на число, если мы не говорим про оптимизации

    • @shamilmammadov8246
      @shamilmammadov8246 Год назад

      Так как там и флоат и инт.

    • @snatvb
      @snatvb Год назад

      @@shamilmammadov8246 не, инты там есть при оптимизациях, когда ты маленькие числа юзаешь, оно под капотом может быть int8, int16

  • @IgorAlov
    @IgorAlov Год назад

    Это зависит от типа данных)

  • @crypto_has_you
    @crypto_has_you Год назад

    Тебе что руки приклеили к столу?

  • @nekoill
    @nekoill Год назад

    Я: Аааааа, да-да-да... Точно... Ну понятно, очевидно же! Разумеется! *Видосик заканчивается* Аааа, чего?..

  • @bornumental146
    @bornumental146 Год назад

    Дежавю какое-то, будто смотрел уже это видео.

    • @frkammm1214
      @frkammm1214 Год назад

      Судя по всему его удалили по какой-то причине и снова выложили

    • @Howtogoit
      @Howtogoit  Год назад

      Даа, это перезалив с другого канала

  • @jarjarbinks6015
    @jarjarbinks6015 Год назад

    госпади, бедные джээсеры :( подарите им decimal

    • @demimurych1
      @demimurych1 Год назад +1

      У JS серов для этого есть bigInt. Который может делать все тоже самое что и decimal при этом имея ограничения по точности рывные доступному обьему оперативной памяти. В отличии от языков где decimal есть а big инт так и не завезли.

    • @Orange_homunkulus31
      @Orange_homunkulus31 Год назад

      ​@@demimurych1Ну и сколько памяти в итоге съедает этот BigInt?

    • @demimurych1
      @demimurych1 Год назад

      @@Orange_homunkulus31 Зависит от того, какого обьема BigInt Вы собираетесь использовать.
      В варианте:
      var theBig = BigInt(1);
      Обьем издержек будет ровно таким же как обычное число с плавающей точкой.
      Естественно чем больше BigInt Вы будете использовать тем больше будут издержки. Что совершенно логично.

  • @just_old_memories
    @just_old_memories Год назад

    Вроде видос недавно вышел, но нода 14 версии... К'мон на дворе 23 год и нода 19 актуалОчка. Хотя от этого ничего не изменится в контексте этой темы, но боже, хотя бы ради эстетического удовольствия!
    А так тема довольно понятно разжёвано и это заслуживает как минимум лайка👍

    • @Howtogoit
      @Howtogoit  Год назад +4

      Спасиба! =)
      У нас на проектах нода не так быстро обновляется

    • @almazkaliyev
      @almazkaliyev Год назад +1

      Можно потом неожиданные баги словить при выкате в продакшн с версией, сильнее старее локальной)

    • @Aaron_Grella
      @Aaron_Grella Год назад

      ​@@almazkaliyev+++
      Вот Openssl кривое обновление было, сломало многим Arch Linux (т.к это Rolling Release), надеюсь дало урок тем, кто не любит старые версии, но актуальные, стабильные).

  • @daniil2704
    @daniil2704 Год назад

    Ну не в любом)
    Lua выдаст 0.3 :)
    Хер знает как, но выдаёт

  • @gign_141
    @gign_141 Год назад

    Верните Боба и другие мультики.

  • @kollpotato
    @kollpotato Год назад

    Lua вошла в чат

  • @AlexandrHryciv
    @AlexandrHryciv 9 месяцев назад +1

    Бла бла бла.

  • @mrmsaid7617
    @mrmsaid7617 Год назад

    фейк, C++ показывает 0.1 + 0.2 = 0.3

    • @bymclnet
      @bymclnet Год назад

      10.8 - (10.7 + 0.1) = 1.77636e-15 (в С++)
      10.8 - 10.7 = 0.100000000000001 (в Python и некоторых других)

    • @mrmsaid7617
      @mrmsaid7617 Год назад

      @@bymclnet python это понятно, но в спп это один из редких и уникальных случаев, а так в основном нет проблем

    • @SalatikInMyHead
      @SalatikInMyHead 7 месяцев назад

      Единственное что он показывает, это что кто-то манипуляторы потока не освоил 🤓 precision выставь побольше и наслаждайся 👍

  • @Mioxiomio
    @Mioxiomio Год назад

    666 лайков

  • @PlaceTickets
    @PlaceTickets Год назад

    Бред. Этот баян уже сто раз рвали ютюберы-блогеры. Дизлайк. Выложи пример на онлайн редактор, с доказательством.

    • @Howtogoit
      @Howtogoit  Год назад +2

      Доказательство чего?)

    • @PlaceTickets
      @PlaceTickets Год назад

      @@Howtogoit того что 0.1+0.2 = 0.3000004

    • @АртурГойко-т8я
      @АртурГойко-т8я Год назад

      @@PlaceTickets нжми f12 открой консоль и проверь

    • @Egor-yr4qz
      @Egor-yr4qz Год назад +2

      @@PlaceTickets В браузере на любом сайте нажми кнопку f12, откроется консоль браузера, она же и компилятор JS (считай онлаин редактор). В консоле запиши 0.1+0.2

    • @gign_141
      @gign_141 Год назад +1

      Открой консоль Chrome и там пропиши. Ответ тебя удивит, чел...