Тренажеры 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
Вспомнил анекдот. Приходит мужик к врачу. Выворачивается, подымает ногу, закидывает руку за спину и говорит. "-Доктор когда я так делаю у меня тут хрустит". Доктор отвечает: "-А попробуйте так не делать.". . Тоже самое. Эта проблема известна всем. и ни кто не страдает. Но некоторые единицы людей даже в этом находят трагедию и снимают ролики "Кто сломал языки?".
10-ричная система плохо делится на 3 и такие же проблемы возникают, если бесконечную периодическую дробь попытаться округлить. Это просто ограничение системы счисления или математики кому как угодно.
Кстати. На самом деле и гораздо проще можно. Те же калькуляторы у нас в телефонах хранят числа в памяти также, как их записывают классические математики. У них 5.3 записывается буквально как 53/10 (хотя и не во всех, например в моём телефоне да, а в гугловском калькуляторе или бабушкином телефоне нет). В этом есть плюс в виде отсутствия таких "парадоксов", да и по памяти на практике такие числа занимают гораздо меньше. Однако асимптотическая сложность вычислений таких чисел (именно что сложений) в разы больше (O(n²) вместо O(n), при n = длина каждого складываемого числа, насколько я помню, поправьте меня если что в комментариях если что). Из-за этого по одному месту идут все действительно крупные вычисления, и это в отличие от операций с точкой повсеместно и неисправимо (хотя неисправимо, скорее, почти. Используя некоторые математические формулы, от алгоритма Евклида, до использования обобщённой гипотезы Римана для сверхбыстрого нахождения простых сомножителей и сокращения оных можно ускорить операции с такими числами в разы. Хотя на практике это извращение и я хз кто кроме создателей специальных либ таким занимается)
Решение: использовать числа с фиксированной запятой. Эти числа хранятся в виде двух целых чисел, одно отвечает за значение, втрое за степень (обычно отрицательную). Из минусов можно выделить только небольшой размер этих чисел
Указанного минуса не будет, если положение фиксированной запятой указывается сразу на целый ряд чисел. Например, как тип поля в базе данных. А вообще, если нужна точность, можно всё хранить как дроби двух целых чисел, числитель и знаменатель. После вычислений делать сокращение дробей, чтобы они сильно не разрастались.
Ну так мы не хуже компьютеров, от числа пи, к примеру, берём, столько, сколько нам уместно для задач брать :) Я, помню, баловался, брал число пи как 3 ровно :)) Надо было сказать, что для точных вычислений есть библиотеки, которые хранят числа в виде строк и реализуют буквально сложение/умножение столбиком
А почему бы просто не хранить само число в исходном виде как без запятой, + ещё оффсет для этой самой запятой считая со старшего бита, а минусы хранить в старшем бите самого числа?
Эти неточности при мат. моделировании и расчётах играют малую роль, так как они предсказуемы, как в плане их появления, так и в плане их величины. У интеловского стандарта есть преимущество: для любого числа, малого или большого, хранится одинаковое количество двоичных значащих цифр. А значит, вокруг нуля малые числа находятся плотнее, чем огромные числа. Как от малого, так и от большого числа можно высчитать одну и ту же долю (например, 1%) с одинаковой относительной погрешностью.
Если нужны точные вычисления, можно умножить на количество знаков после запятой, тем самым получив целое число, что то с ним сделать, а потом поделить обратно :) 0.2 + 0.1 = 0.30000000000000004 (0.2 * 10 + 0.1 * 10) / 10 = 0.3
Автор видео смешал все в кучу, добавив при этом своими домыслами которые никакого отношения не имеют к JS 00:41:00 *Большая часть скажет так исторически сложилось* Так скажет только та часть, которая училась по видео подобным этому. Любой студент, который учился на инфизе, даже без программирования, прекрасно знает что такое точность вычислений и какие существуют на сегодняшний момент варианты решения этой проблемы. Студенту второго курса инфиза, достаточно открыть спецификацию ИЕЕЕ 754 чтобы пояснить все подводные камни стандарта оперирования чисел с плавающей точкой. 70 тые года, процессор 8087 и перепетии с интел там вообще непричем. Вы бы внимательно почитали те ссылки что сами даете. Там возня была за то, чтобы включить в стандарт дополнительный аппарат расширения точности вычислений в том случае, когда требуемая мантисса будет приводить к очень грубым округлениям. Никакого отношения к тому, о чем говорит автор в видео это не имеет. Прочтите уже сами полностью интервью Кэхана, чтобы не нести всю эту ахинею. А то происходит та же история как с утверждением что typeof null === 'object' это дескать была ошибка. Один не дочитал второй не так понял. Современный JS вам предоставляет BigInt тип, которого более чем достаточно для организации логики вычисления с любой точностью, которую позволит Вам обьем Вашей оперативной памяти. ИЕЕЕ 754 это сдантарт дефакто для работы с числами с плавающей запятой. Он закреплен стандартом, который в том числе описывает все его ограничения. Проблемы студентов начинаются тогда, когда они не зная математики, где проблема точности точно такая же, думают что вычислительные машины могут быть устроены иначе.
Так это просто новичковое видео. Если ты супер профи, то просто смотри соответствующий по сложности контент. Ещё лучше: запиши гайд лучше, чем автор.) А пока эти слова остаются лишь словами
@@mega_mango > _то просто смотри соответствующий по сложности контент_ Дай мне хотя бы одну ссылку на такой контент о JS? > _Ещё лучше: запиши гайд лучше, чем автор_ Я провел больше 50 стримов общей сложностью больше 100 часов (на youtube канал asforjs). Пытаясь как раз раскрыть эти самые вопросы. Не говоря уже о том, что если бы не война, то полтора года назад, у меня должна была бы выйти книжка.
у вас 10ка... там вроде virtio для якобы безопасности используется, вы можете что нибудь подсказать по этому поводу? а то я смотрел, его патентовали для какого-то хаоса, так же смотрел это шина pci, а сейчас с высокими частотами техника, и покрывают разъемы медью, хотя раньше были из простого металла, да и каждый пятачок на креплениях в меди... А virtio используется в qemu как я понял для подключения к шинам данных тонких-толстых клиентов... и это потом называют какой-то энтропией. 3/10 яблока и немножко энтропии
Ты прекрасен! Лучшее объяснение, которое я когда-либо видел! Спасибо! Вот ток фраза в конце "из-за неточности математики" вгоняет в ступор... Качество шоу - супер!❤
У JS серов для этого есть bigInt. Который может делать все тоже самое что и decimal при этом имея ограничения по точности рывные доступному обьему оперативной памяти. В отличии от языков где decimal есть а big инт так и не завезли.
@@Orange_homunkulus31 Зависит от того, какого обьема BigInt Вы собираетесь использовать. В варианте: var theBig = BigInt(1); Обьем издержек будет ровно таким же как обычное число с плавающей точкой. Естественно чем больше BigInt Вы будете использовать тем больше будут издержки. Что совершенно логично.
Вроде видос недавно вышел, но нода 14 версии... К'мон на дворе 23 год и нода 19 актуалОчка. Хотя от этого ничего не изменится в контексте этой темы, но боже, хотя бы ради эстетического удовольствия! А так тема довольно понятно разжёвано и это заслуживает как минимум лайка👍
@@almazkaliyev+++ Вот Openssl кривое обновление было, сломало многим Arch Linux (т.к это Rolling Release), надеюсь дало урок тем, кто не любит старые версии, но актуальные, стабильные).
@@PlaceTickets В браузере на любом сайте нажми кнопку f12, откроется консоль браузера, она же и компилятор JS (считай онлаин редактор). В консоле запиши 0.1+0.2
Тренажеры 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
Вспомнил анекдот. Приходит мужик к врачу. Выворачивается, подымает ногу, закидывает руку за спину и говорит. "-Доктор когда я так делаю у меня тут хрустит". Доктор отвечает: "-А попробуйте так не делать.".
.
Тоже самое. Эта проблема известна всем. и ни кто не страдает. Но некоторые единицы людей даже в этом находят трагедию и снимают ролики "Кто сломал языки?".
10-ричная система плохо делится на 3 и такие же проблемы возникают, если бесконечную периодическую дробь попытаться округлить. Это просто ограничение системы счисления или математики кому как угодно.
За 12-ричной системой будущее
@@jioneg9369 а как делить на 5?
@@yahton309 а как 10 делить на 6?
@@jioneg9369 за 360тиричной*. Ву ней больше всего делителей.
@@yahton309 Лучше сразу в 2310-ой
Вывод: программист хуже пятиклассника
Супер! Обожаю ваш канал за глубокие фундаментальные знания и полезные лайфхаки 😊
Кстати. На самом деле и гораздо проще можно. Те же калькуляторы у нас в телефонах хранят числа в памяти также, как их записывают классические математики. У них 5.3 записывается буквально как 53/10 (хотя и не во всех, например в моём телефоне да, а в гугловском калькуляторе или бабушкином телефоне нет). В этом есть плюс в виде отсутствия таких "парадоксов", да и по памяти на практике такие числа занимают гораздо меньше. Однако асимптотическая сложность вычислений таких чисел (именно что сложений) в разы больше (O(n²) вместо O(n), при n = длина каждого складываемого числа, насколько я помню, поправьте меня если что в комментариях если что). Из-за этого по одному месту идут все действительно крупные вычисления, и это в отличие от операций с точкой повсеместно и неисправимо (хотя неисправимо, скорее, почти. Используя некоторые математические формулы, от алгоритма Евклида, до использования обобщённой гипотезы Римана для сверхбыстрого нахождения простых сомножителей и сокращения оных можно ускорить операции с такими числами в разы. Хотя на практике это извращение и я хз кто кроме создателей специальных либ таким занимается)
Решение: использовать числа с фиксированной запятой. Эти числа хранятся в виде двух целых чисел, одно отвечает за значение, втрое за степень (обычно отрицательную). Из минусов можно выделить только небольшой размер этих чисел
Указанного минуса не будет, если положение фиксированной запятой указывается сразу на целый ряд чисел. Например, как тип поля в базе данных.
А вообще, если нужна точность, можно всё хранить как дроби двух целых чисел, числитель и знаменатель. После вычислений делать сокращение дробей, чтобы они сильно не разрастались.
Ну так мы не хуже компьютеров, от числа пи, к примеру, берём, столько, сколько нам уместно для задач брать :) Я, помню, баловался, брал число пи как 3 ровно :)) Надо было сказать, что для точных вычислений есть библиотеки, которые хранят числа в виде строк и реализуют буквально сложение/умножение столбиком
Хорошая подача, перезалив засчитан ;-)
А почему бы просто не хранить само число в исходном виде как без запятой, + ещё оффсет для этой самой запятой считая со старшего бита, а минусы хранить в старшем бите самого числа?
Эти неточности при мат. моделировании и расчётах играют малую роль, так как они предсказуемы, как в плане их появления, так и в плане их величины.
У интеловского стандарта есть преимущество: для любого числа, малого или большого, хранится одинаковое количество двоичных значащих цифр. А значит, вокруг нуля малые числа находятся плотнее, чем огромные числа. Как от малого, так и от большого числа можно высчитать одну и ту же долю (например, 1%) с одинаковой относительной погрешностью.
Если нужны точные вычисления, можно умножить на количество знаков после запятой, тем самым получив целое число, что то с ним сделать, а потом поделить обратно :)
0.2 + 0.1 = 0.30000000000000004
(0.2 * 10 + 0.1 * 10) / 10 = 0.3
Автор видео смешал все в кучу, добавив при этом своими домыслами которые никакого отношения не имеют к JS
00:41:00 *Большая часть скажет так исторически сложилось*
Так скажет только та часть, которая училась по видео подобным этому. Любой студент, который учился на инфизе, даже без программирования, прекрасно знает что такое точность вычислений и какие существуют на сегодняшний момент варианты решения этой проблемы.
Студенту второго курса инфиза, достаточно открыть спецификацию ИЕЕЕ 754 чтобы пояснить все подводные камни стандарта оперирования чисел с плавающей точкой.
70 тые года, процессор 8087 и перепетии с интел там вообще непричем. Вы бы внимательно почитали те ссылки что сами даете. Там возня была за то, чтобы включить в стандарт дополнительный аппарат расширения точности вычислений в том случае, когда требуемая мантисса будет приводить к очень грубым округлениям.
Никакого отношения к тому, о чем говорит автор в видео это не имеет.
Прочтите уже сами полностью интервью Кэхана, чтобы не нести всю эту ахинею. А то происходит та же история как с утверждением что typeof null === 'object' это дескать была ошибка. Один не дочитал второй не так понял.
Современный JS вам предоставляет BigInt тип, которого более чем достаточно для организации логики вычисления с любой точностью, которую позволит Вам обьем Вашей оперативной памяти.
ИЕЕЕ 754 это сдантарт дефакто для работы с числами с плавающей запятой. Он закреплен стандартом, который в том числе описывает все его ограничения.
Проблемы студентов начинаются тогда, когда они не зная математики, где проблема точности точно такая же, думают что вычислительные машины могут быть устроены иначе.
Так это просто новичковое видео. Если ты супер профи, то просто смотри соответствующий по сложности контент. Ещё лучше: запиши гайд лучше, чем автор.) А пока эти слова остаются лишь словами
@@mega_mango > _то просто смотри соответствующий по сложности контент_
Дай мне хотя бы одну ссылку на такой контент о JS?
> _Ещё лучше: запиши гайд лучше, чем автор_
Я провел больше 50 стримов общей сложностью больше 100 часов (на youtube канал asforjs).
Пытаясь как раз раскрыть эти самые вопросы. Не говоря уже о том, что если бы не война, то полтора года назад, у меня должна была бы выйти книжка.
я чомусь був впевнений що побачу коммент Мурича під цим відео ))
Привет, дружище 🤝
Рад тебя видеть ✌️👍
Привет! =) И я рад снова тебя видеть)
у вас 10ка... там вроде virtio для якобы безопасности используется, вы можете что нибудь подсказать по этому поводу? а то я смотрел, его патентовали для какого-то хаоса, так же смотрел это шина pci, а сейчас с высокими частотами техника, и покрывают разъемы медью, хотя раньше были из простого металла, да и каждый пятачок на креплениях в меди... А virtio используется в qemu как я понял для подключения к шинам данных тонких-толстых клиентов... и это потом называют какой-то энтропией.
3/10 яблока и немножко энтропии
Привет, почему ты удалил свои видео с к другого канала? 🧐
Возвращаюсь на старый канал просто)
Эксперимент с новым каналом оказался не очень удачным
Ты прекрасен!
Лучшее объяснение, которое я когда-либо видел! Спасибо!
Вот ток фраза в конце "из-за неточности математики" вгоняет в ступор...
Качество шоу - супер!❤
if float('inf') / float('inf') = 0.0:
print('Phew, oh, normal')
elif float('inf') / float('inf') = nan:
print('WTF?')
а чем 1,010(1001)×10¹⁰ лучше 110101/1010¹?
йосип хорват? Ты не из Хорватии случаем?
@@drino955jug3 кто? я не из Хорватии
@@MityaNamikin ты ник поменял или он у тебя такой и был MeeThya (Митя)? Просто у меня походу какой-то баг с ютубом был
@@drino955jug3 я был и есть Митя)
@@MityaNamikin я тоже Митя кста. Ля, вот это баг.................
Errortime???
Голос очень похож...
Мне нравился старый дизайн с героями мультиков :(
Сейчас айдентика потерялась и глаз не цепляется в ленте
а в vax стандарте была такая проблема ?)
Если проблема не из-за стандарта, то для чего историческая справка про борьбу стандартов?
в js используется 53 бита на число, если мы не говорим про оптимизации
Так как там и флоат и инт.
@@shamilmammadov8246 не, инты там есть при оптимизациях, когда ты маленькие числа юзаешь, оно под капотом может быть int8, int16
Это зависит от типа данных)
Тебе что руки приклеили к столу?
Я: Аааааа, да-да-да... Точно... Ну понятно, очевидно же! Разумеется! *Видосик заканчивается* Аааа, чего?..
Дежавю какое-то, будто смотрел уже это видео.
Судя по всему его удалили по какой-то причине и снова выложили
Даа, это перезалив с другого канала
госпади, бедные джээсеры :( подарите им decimal
У JS серов для этого есть bigInt. Который может делать все тоже самое что и decimal при этом имея ограничения по точности рывные доступному обьему оперативной памяти. В отличии от языков где decimal есть а big инт так и не завезли.
@@demimurych1Ну и сколько памяти в итоге съедает этот BigInt?
@@Orange_homunkulus31 Зависит от того, какого обьема BigInt Вы собираетесь использовать.
В варианте:
var theBig = BigInt(1);
Обьем издержек будет ровно таким же как обычное число с плавающей точкой.
Естественно чем больше BigInt Вы будете использовать тем больше будут издержки. Что совершенно логично.
Вроде видос недавно вышел, но нода 14 версии... К'мон на дворе 23 год и нода 19 актуалОчка. Хотя от этого ничего не изменится в контексте этой темы, но боже, хотя бы ради эстетического удовольствия!
А так тема довольно понятно разжёвано и это заслуживает как минимум лайка👍
Спасиба! =)
У нас на проектах нода не так быстро обновляется
Можно потом неожиданные баги словить при выкате в продакшн с версией, сильнее старее локальной)
@@almazkaliyev+++
Вот Openssl кривое обновление было, сломало многим Arch Linux (т.к это Rolling Release), надеюсь дало урок тем, кто не любит старые версии, но актуальные, стабильные).
Ну не в любом)
Lua выдаст 0.3 :)
Хер знает как, но выдаёт
Верните Боба и другие мультики.
Lua вошла в чат
Бла бла бла.
фейк, C++ показывает 0.1 + 0.2 = 0.3
10.8 - (10.7 + 0.1) = 1.77636e-15 (в С++)
10.8 - 10.7 = 0.100000000000001 (в Python и некоторых других)
@@bymclnet python это понятно, но в спп это один из редких и уникальных случаев, а так в основном нет проблем
Единственное что он показывает, это что кто-то манипуляторы потока не освоил 🤓 precision выставь побольше и наслаждайся 👍
666 лайков
Бред. Этот баян уже сто раз рвали ютюберы-блогеры. Дизлайк. Выложи пример на онлайн редактор, с доказательством.
Доказательство чего?)
@@Howtogoit того что 0.1+0.2 = 0.3000004
@@PlaceTickets нжми f12 открой консоль и проверь
@@PlaceTickets В браузере на любом сайте нажми кнопку f12, откроется консоль браузера, она же и компилятор JS (считай онлаин редактор). В консоле запиши 0.1+0.2
Открой консоль Chrome и там пропиши. Ответ тебя удивит, чел...