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

  Рет қаралды 17,794

Как пройти в IT?

Как пройти в IT?

Күн бұрын

Все программисты знают, что 0.1 + 0.2 != 0.3
Но почему так происходит? Это фундаментальный баг программирования?
Разберемся, Господа!
Вливайся в команду мечты:
psb-hr@yandex.ru
Вакансии: habr.com/ru/company/psb/vacan...
Мой телеграмм-канал:
t.me/howToLearnIT
Телеграмм-канал для любителей фронтенда:
t.me/frontendnoteschannel
Бусти:
boosty.to/how-to-learn-it
Литература:
habr.com/ru/post/112953/
• Floating Point Numbers...
docs.oracle.com/cd/E19957-01/...
standards.ieee.org/ieee/754/4...
stackoverflow.com/questions/5...
0:00 Дебют
0:35 Как числа получили стандарт?
2:57 Как хранятся в памяти числа с плавающей точкой?
4:24 Рекламная пауза
5:05 Сколько памяти выделяется на хранение чисел?
9:07 И почему 0.1 + 0.2 != 0.3?
10:25 Это фундаментальный баг?
#it #programming

Пікірлер: 79
@it2138
@it2138 Жыл бұрын
Тренажеры 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/ kzbin.info/www/bejne/hou1emR_m7inj5I 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
@SergioKornelius
@SergioKornelius Жыл бұрын
Вспомнил анекдот. Приходит мужик к врачу. Выворачивается, подымает ногу, закидывает руку за спину и говорит. "-Доктор когда я так делаю у меня тут хрустит". Доктор отвечает: "-А попробуйте так не делать.". . Тоже самое. Эта проблема известна всем. и ни кто не страдает. Но некоторые единицы людей даже в этом находят трагедию и снимают ролики "Кто сломал языки?".
@IT-Svyatoslav
@IT-Svyatoslav Жыл бұрын
Супер! Обожаю ваш канал за глубокие фундаментальные знания и полезные лайфхаки 😊
@UC1C0GDMTjasAdhELHZ6lZNg
@UC1C0GDMTjasAdhELHZ6lZNg Жыл бұрын
10-ричная система плохо делится на 3 и такие же проблемы возникают, если бесконечную периодическую дробь попытаться округлить. Это просто ограничение системы счисления или математики кому как угодно.
@jioneg9369
@jioneg9369 11 ай бұрын
За 12-ричной системой будущее
@yahton309
@yahton309 11 ай бұрын
​@@jioneg9369 а как делить на 5?
@jioneg9369
@jioneg9369 11 ай бұрын
@@yahton309 а как 10 делить на 6?
@yahton309
@yahton309 11 ай бұрын
@@jioneg9369 за 360тиричной*. Ву ней больше всего делителей.
@replays4026
@replays4026 10 ай бұрын
@@yahton309 Лучше сразу в 2310-ой
@2difficult2do
@2difficult2do Жыл бұрын
Хорошая подача, перезалив засчитан ;-)
@konstantinchernyaev3011
@konstantinchernyaev3011 Жыл бұрын
Решение: использовать числа с фиксированной запятой. Эти числа хранятся в виде двух целых чисел, одно отвечает за значение, втрое за степень (обычно отрицательную). Из минусов можно выделить только небольшой размер этих чисел
@Ryhor1
@Ryhor1 10 ай бұрын
Указанного минуса не будет, если положение фиксированной запятой указывается сразу на целый ряд чисел. Например, как тип поля в базе данных. А вообще, если нужна точность, можно всё хранить как дроби двух целых чисел, числитель и знаменатель. После вычислений делать сокращение дробей, чтобы они сильно не разрастались.
@user-nu2jz1sb4s
@user-nu2jz1sb4s Жыл бұрын
Ну так мы не хуже компьютеров, от числа пи, к примеру, берём, столько, сколько нам уместно для задач брать :) Я, помню, баловался, брал число пи как 3 ровно :)) Надо было сказать, что для точных вычислений есть библиотеки, которые хранят числа в виде строк и реализуют буквально сложение/умножение столбиком
@mega_mango
@mega_mango 10 ай бұрын
Кстати. На самом деле и гораздо проще можно. Те же калькуляторы у нас в телефонах хранят числа в памяти также, как их записывают классические математики. У них 5.3 записывается буквально как 53/10 (хотя и не во всех, например в моём телефоне да, а в гугловском калькуляторе или бабушкином телефоне нет). В этом есть плюс в виде отсутствия таких "парадоксов", да и по памяти на практике такие числа занимают гораздо меньше. Однако асимптотическая сложность вычислений таких чисел (именно что сложений) в разы больше (O(n²) вместо O(n), при n = длина каждого складываемого числа, насколько я помню, поправьте меня если что в комментариях если что). Из-за этого по одному месту идут все действительно крупные вычисления, и это в отличие от операций с точкой повсеместно и неисправимо (хотя неисправимо, скорее, почти. Используя некоторые математические формулы, от алгоритма Евклида, до использования обобщённой гипотезы Римана для сверхбыстрого нахождения простых сомножителей и сокращения оных можно ускорить операции с такими числами в разы. Хотя на практике это извращение и я хз кто кроме создателей специальных либ таким занимается)
@max_mgtow
@max_mgtow Жыл бұрын
Привет, дружище 🤝 Рад тебя видеть ✌️👍
@it2138
@it2138 Жыл бұрын
Привет! =) И я рад снова тебя видеть)
@_1_m
@_1_m 11 ай бұрын
Вывод: программист хуже пятиклассника
@alexandrstrekalovskiy4083
@alexandrstrekalovskiy4083 Жыл бұрын
Ты прекрасен! Лучшее объяснение, которое я когда-либо видел! Спасибо! Вот ток фраза в конце "из-за неточности математики" вгоняет в ступор... Качество шоу - супер!❤
@nurberg2Request_live_VS
@nurberg2Request_live_VS Жыл бұрын
у вас 10ка... там вроде virtio для якобы безопасности используется, вы можете что нибудь подсказать по этому поводу? а то я смотрел, его патентовали для какого-то хаоса, так же смотрел это шина pci, а сейчас с высокими частотами техника, и покрывают разъемы медью, хотя раньше были из простого металла, да и каждый пятачок на креплениях в меди... А virtio используется в qemu как я понял для подключения к шинам данных тонких-толстых клиентов... и это потом называют какой-то энтропией. 3/10 яблока и немножко энтропии
@IgorAlov
@IgorAlov Жыл бұрын
Это зависит от типа данных)
@vladlen-krut
@vladlen-krut 9 ай бұрын
А почему бы просто не хранить само число в исходном виде как без запятой, + ещё оффсет для этой самой запятой считая со старшего бита, а минусы хранить в старшем бите самого числа?
@gernet9250
@gernet9250 Жыл бұрын
Errortime??? Голос очень похож...
@user-ib5ml1vz5r
@user-ib5ml1vz5r 7 ай бұрын
Эти неточности при мат. моделировании и расчётах играют малую роль, так как они предсказуемы, как в плане их появления, так и в плане их величины. У интеловского стандарта есть преимущество: для любого числа, малого или большого, хранится одинаковое количество двоичных значащих цифр. А значит, вокруг нуля малые числа находятся плотнее, чем огромные числа. Как от малого, так и от большого числа можно высчитать одну и ту же долю (например, 1%) с одинаковой относительной погрешностью.
@user-su9iw4hi7q
@user-su9iw4hi7q Жыл бұрын
а в vax стандарте была такая проблема ?)
@daniil2704
@daniil2704 10 ай бұрын
Если нужны точные вычисления, можно умножить на количество знаков после запятой, тем самым получив целое число, что то с ним сделать, а потом поделить обратно :) 0.2 + 0.1 = 0.30000000000000004 (0.2 * 10 + 0.1 * 10) / 10 = 0.3
@baileysli6235
@baileysli6235 Жыл бұрын
Мне нравился старый дизайн с героями мультиков :( Сейчас айдентика потерялась и глаз не цепляется в ленте
@VladVeninTV
@VladVeninTV Жыл бұрын
Привет, почему ты удалил свои видео с к другого канала? 🧐
@it2138
@it2138 Жыл бұрын
Возвращаюсь на старый канал просто) Эксперимент с новым каналом оказался не очень удачным
@ruria_coda
@ruria_coda Жыл бұрын
if float('inf') / float('inf') = 0.0: print('Phew, oh, normal') elif float('inf') / float('inf') = nan: print('WTF?')
@just_old_memories_7996
@just_old_memories_7996 Жыл бұрын
Вроде видос недавно вышел, но нода 14 версии... К'мон на дворе 23 год и нода 19 актуалОчка. Хотя от этого ничего не изменится в контексте этой темы, но боже, хотя бы ради эстетического удовольствия! А так тема довольно понятно разжёвано и это заслуживает как минимум лайка👍
@it2138
@it2138 Жыл бұрын
Спасиба! =) У нас на проектах нода не так быстро обновляется
@almazkaliyev
@almazkaliyev Жыл бұрын
Можно потом неожиданные баги словить при выкате в продакшн с версией, сильнее старее локальной)
@Aaron_Grella
@Aaron_Grella 10 ай бұрын
​@@almazkaliyev+++ Вот Openssl кривое обновление было, сломало многим Arch Linux (т.к это Rolling Release), надеюсь дало урок тем, кто не любит старые версии, но актуальные, стабильные).
@nekoill
@nekoill Жыл бұрын
Я: Аааааа, да-да-да... Точно... Ну понятно, очевидно же! Разумеется! *Видосик заканчивается* Аааа, чего?..
@bornumental146
@bornumental146 Жыл бұрын
Дежавю какое-то, будто смотрел уже это видео.
@frkammm1214
@frkammm1214 Жыл бұрын
Судя по всему его удалили по какой-то причине и снова выложили
@it2138
@it2138 Жыл бұрын
Даа, это перезалив с другого канала
@kollpotato
@kollpotato Жыл бұрын
Lua вошла в чат
@samolevich
@samolevich Жыл бұрын
Если проблема не из-за стандарта, то для чего историческая справка про борьбу стандартов?
@snatvb
@snatvb Жыл бұрын
в js используется 53 бита на число, если мы не говорим про оптимизации
@shamilmammadov8246
@shamilmammadov8246 Жыл бұрын
Так как там и флоат и инт.
@snatvb
@snatvb Жыл бұрын
@@shamilmammadov8246 не, инты там есть при оптимизациях, когда ты маленькие числа юзаешь, оно под капотом может быть int8, int16
@demimurych1
@demimurych1 Жыл бұрын
Автор видео смешал все в кучу, добавив при этом своими домыслами которые никакого отношения не имеют к JS 00:41:00 *Большая часть скажет так исторически сложилось* Так скажет только та часть, которая училась по видео подобным этому. Любой студент, который учился на инфизе, даже без программирования, прекрасно знает что такое точность вычислений и какие существуют на сегодняшний момент варианты решения этой проблемы. Студенту второго курса инфиза, достаточно открыть спецификацию ИЕЕЕ 754 чтобы пояснить все подводные камни стандарта оперирования чисел с плавающей точкой. 70 тые года, процессор 8087 и перепетии с интел там вообще непричем. Вы бы внимательно почитали те ссылки что сами даете. Там возня была за то, чтобы включить в стандарт дополнительный аппарат расширения точности вычислений в том случае, когда требуемая мантисса будет приводить к очень грубым округлениям. Никакого отношения к тому, о чем говорит автор в видео это не имеет. Прочтите уже сами полностью интервью Кэхана, чтобы не нести всю эту ахинею. А то происходит та же история как с утверждением что typeof null === 'object' это дескать была ошибка. Один не дочитал второй не так понял. Современный JS вам предоставляет BigInt тип, которого более чем достаточно для организации логики вычисления с любой точностью, которую позволит Вам обьем Вашей оперативной памяти. ИЕЕЕ 754 это сдантарт дефакто для работы с числами с плавающей запятой. Он закреплен стандартом, который в том числе описывает все его ограничения. Проблемы студентов начинаются тогда, когда они не зная математики, где проблема точности точно такая же, думают что вычислительные машины могут быть устроены иначе.
@mega_mango
@mega_mango 10 ай бұрын
Так это просто новичковое видео. Если ты супер профи, то просто смотри соответствующий по сложности контент. Ещё лучше: запиши гайд лучше, чем автор.) А пока эти слова остаются лишь словами
@demimurych1
@demimurych1 10 ай бұрын
@@mega_mango > _то просто смотри соответствующий по сложности контент_ Дай мне хотя бы одну ссылку на такой контент о JS? > _Ещё лучше: запиши гайд лучше, чем автор_ Я провел больше 50 стримов общей сложностью больше 100 часов (на youtube канал asforjs). Пытаясь как раз раскрыть эти самые вопросы. Не говоря уже о том, что если бы не война, то полтора года назад, у меня должна была бы выйти книжка.
@dmitry4337
@dmitry4337 10 ай бұрын
я чомусь був впевнений що побачу коммент Мурича під цим відео ))
@MityaNamikin
@MityaNamikin Жыл бұрын
а чем 1,010(1001)×10¹⁰ лучше 110101/1010¹?
@drino955jug3
@drino955jug3 Жыл бұрын
йосип хорват? Ты не из Хорватии случаем?
@MityaNamikin
@MityaNamikin Жыл бұрын
@@drino955jug3 кто? я не из Хорватии
@drino955jug3
@drino955jug3 Жыл бұрын
@@MityaNamikin ты ник поменял или он у тебя такой и был MeeThya (Митя)? Просто у меня походу какой-то баг с ютубом был
@MityaNamikin
@MityaNamikin Жыл бұрын
@@drino955jug3 я был и есть Митя)
@drino955jug3
@drino955jug3 Жыл бұрын
@@MityaNamikin я тоже Митя кста. Ля, вот это баг.................
@daniil2704
@daniil2704 10 ай бұрын
Ну не в любом) Lua выдаст 0.3 :) Хер знает как, но выдаёт
@gign_141
@gign_141 Жыл бұрын
Верните Боба и другие мультики.
@jarjarbinks6015
@jarjarbinks6015 Жыл бұрын
госпади, бедные джээсеры :( подарите им decimal
@demimurych1
@demimurych1 Жыл бұрын
У JS серов для этого есть bigInt. Который может делать все тоже самое что и decimal при этом имея ограничения по точности рывные доступному обьему оперативной памяти. В отличии от языков где decimal есть а big инт так и не завезли.
@Orange_homunkulus31
@Orange_homunkulus31 11 ай бұрын
​@@demimurych1Ну и сколько памяти в итоге съедает этот BigInt?
@demimurych1
@demimurych1 11 ай бұрын
@@Orange_homunkulus31 Зависит от того, какого обьема BigInt Вы собираетесь использовать. В варианте: var theBig = BigInt(1); Обьем издержек будет ровно таким же как обычное число с плавающей точкой. Естественно чем больше BigInt Вы будете использовать тем больше будут издержки. Что совершенно логично.
@crypto_has_you
@crypto_has_you 10 ай бұрын
Тебе что руки приклеили к столу?
@Mioxiomio
@Mioxiomio 11 ай бұрын
666 лайков
@mrmsaid7617
@mrmsaid7617 10 ай бұрын
фейк, C++ показывает 0.1 + 0.2 = 0.3
@bymclnet
@bymclnet 9 ай бұрын
10.8 - (10.7 + 0.1) = 1.77636e-15 (в С++) 10.8 - 10.7 = 0.100000000000001 (в Python и некоторых других)
@mrmsaid7617
@mrmsaid7617 9 ай бұрын
@@bymclnet python это понятно, но в спп это один из редких и уникальных случаев, а так в основном нет проблем
@user-te9km4nu4x
@user-te9km4nu4x Ай бұрын
Бла бла бла.
@SergioKornelius
@SergioKornelius Жыл бұрын
Бред. Этот баян уже сто раз рвали ютюберы-блогеры. Дизлайк. Выложи пример на онлайн редактор, с доказательством.
@it2138
@it2138 Жыл бұрын
Доказательство чего?)
@SergioKornelius
@SergioKornelius Жыл бұрын
@@it2138 того что 0.1+0.2 = 0.3000004
@user-zx2ur7rc9q
@user-zx2ur7rc9q Жыл бұрын
@@SergioKornelius нжми f12 открой консоль и проверь
@Egor-yr4qz
@Egor-yr4qz Жыл бұрын
@@SergioKornelius В браузере на любом сайте нажми кнопку f12, откроется консоль браузера, она же и компилятор JS (считай онлаин редактор). В консоле запиши 0.1+0.2
@gign_141
@gign_141 Жыл бұрын
Открой консоль Chrome и там пропиши. Ответ тебя удивит, чел...
Как запрограммировать Чайник?!
12:27
Как пройти в IT?
Рет қаралды 17 М.
Бесконечно Реактивный JavaScript
16:52
Как пройти в IT?
Рет қаралды 23 М.
Barriga de grávida aconchegante? 🤔💡
00:10
Polar em português
Рет қаралды 47 МЛН
I PEELED OFF THE CARDBOARD WATERMELON!#asmr
00:56
HAYATAKU はやたく
Рет қаралды 30 МЛН
Гайд на собес Джаваскриптизёра!
13:16
Как пройти в IT?
Рет қаралды 29 М.
Откуда в программах неточные числа
9:07
Новый JavaScript!
12:30
Как пройти в IT?
Рет қаралды 64 М.
Как пишут код для Космоса?
13:07
Как пройти в IT?
Рет қаралды 5 М.
Frontend заменит мобильную разработку? WTF?!?!
11:15
Как пройти в IT?
Рет қаралды 10 М.
Как пройти в IT? Каминг-аут!
6:10
Как пройти в IT?
Рет қаралды 10 М.
HTMX заменит Frontend?! WTF?
12:12
Как пройти в IT?
Рет қаралды 109 М.