Тёмный

Как хранить дробные числа (числа с плавающей точкой) 

Антон Филатов
Подписаться 2,8 тыс.
Просмотров 8 тыс.
50% 1

Привет! В этом видео рассматриваем числа с плавающей точкой и проблемы, связанные с ними. Буду признателен, если вы дадите мне какую-нибудь обратную связь!
Поддержать автора:
Boosty: boosty.to/antonfilatov
DonationAlerts: www.donationalerts.com/r/anto...
Таймкоды:
0:00 - начало
01:22 - разбираемся с числом 5.5
5:45 - душним на стандарт
7:57 - пример "без воды"
8:48 - сложности у формата

Опубликовано:

 

28 июн 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 84   
@user-cy3do4xc2c
@user-cy3do4xc2c Год назад
Вот, мы тут восхищаемся красотой технических решений, а некоторые становятся миллионерами благодаря этим случайным циферкам после запятой 😅
@user-ut2ii3qi6x
@user-ut2ii3qi6x Год назад
Благодарю вас, Антон. У вас - талант объяснять. И талант блогера. Вы можете объяснять довольно скучные (для непосвященных) темы очень увлекательно. Темы роликов у вас - для меня - актуальные. Подписался на вас!
@kemal667
@kemal667 Год назад
Насчёт странного способа записи порядка: весь стандарт float основан на том, чтобы числа можно было сравнивать как целые.
@Ratmirsh
@Ratmirsh Год назад
Антон, рад что наткнулся на ваш канал, очень понятно объясняете. Местами кринжанул со скетчей, может это только я такой) Продолжайте, очень интересно!
@jtprogru_channel
@jtprogru_channel Год назад
Я хочу еще таких видосов! Это настолько круто, что хочется снова и снова!
@inotak
@inotak Год назад
Браво за объяснение таких вещей. Мне нравится!
@rechw769
@rechw769 Год назад
Спасибо за видео!
@user-mp1vd9ww3j
@user-mp1vd9ww3j Год назад
Прелесть какое хорошее разъяснение. Не душно и по факту!
@math-to-masses
@math-to-masses Год назад
Спасибо! ^^
@iljakot_tran4131
@iljakot_tran4131 Год назад
Классный видос! А на моменте экономии бита я прям сам захотел танцевать
@user-mw9gk1li1k
@user-mw9gk1li1k Год назад
Какое кайфовое объяснение
@sanchopansa8956
@sanchopansa8956 Год назад
Не так часто пишу комментарии, но тут не могу не заметить, что навыки объяснения у автора на отличном уровне) Не скажу, что тема сильно сложная, но непросвящённому человеку куда приятнее воспринимать такой контент с наглядными объяснениями, чем в исключительно формульном виде.
@peterl4864
@peterl4864 Год назад
Огонь! Я прям вспоминаю уроки по С++ в десятом классе)
@dontyoudaredude
@dontyoudaredude Год назад
Очень интересный видос!
@JamshidShoyusupov-fo1gm
@JamshidShoyusupov-fo1gm 5 месяцев назад
Круто!!!
@user-tv2kx7oy1j
@user-tv2kx7oy1j Год назад
Интересное видео) Было бы очень круто, если бы вы рассказали про нейросети в следующих видео!
@math-to-masses
@math-to-masses Год назад
Спасибо! Я точно расскажу об этом, как только придумаю, как это сделать без духоты :)
@-Sergey
@-Sergey Год назад
Сложно. Но интересно. Надо будет ещё разок пересмотреть.
@borisvalerievich5831
@borisvalerievich5831 Год назад
Целочисленная математика наше всё
@arm_128bit
@arm_128bit Год назад
Молодец, расширил мои познания, спасибо. Видео понравилось и ещё понравилось видео, где разработчики игры решили обойти использование квадратного корня с помощью хитрой конструкции. Вообщем, разбор деталей очень интересен. Может расскажешь, как компьютер проводит операцию квадратного корня?
@justafish_
@justafish_ 11 месяцев назад
3:55 как по мне это наоборот более правильная и логичная форма, чем у дополнительного кода, в ней 1000 > 0000, потому что старший разряд в первом числе больше, чем во втором. Это то, как работают числа в любой системе счисления. А вот в дополнительном коде у нас почему то 0000 > 1000 (потому что старший разряд - это знак, да еще и чем он больше, тем число меньше)
@programm1ct
@programm1ct Год назад
Всё просто - 1.4 или 2.6 не возможно точно записать в дроичных дробях, точно так же как не возможно записать 1/3 в десятичных дробях.
@zzubra8802
@zzubra8802 Год назад
Красиво
@barcek2281
@barcek2281 Год назад
1) классно. 2) я еще больше стать прораммистом
@KT315A-qp9re
@KT315A-qp9re 3 месяца назад
4:14 так сделали, чтобы сортировку чисел делать быстрее. Первый проход можно делать только по первому байту.
@ErrorsMissing
@ErrorsMissing Год назад
вычитать -127 нужно для хранения отрицательной экспоненты. Конечно можно было бы использовать sign бит, но тогда бы у нас экспонента лежала бы в диапазоне (-127, +127) так как два значения(10000000 и 00000000, они же +0 и -0 в десятичной) были эквивалентны. Если же мы вычитаем 127, то получаем значение экспоненты в диапазоне (-127, +128), а значит что неиспользованное значение может служит идентификатором NaN и Infinity.
@math-to-masses
@math-to-masses Год назад
Блин, это так просто и логично. Почему я сам не догадался! Спасибо!
@user-er6zr1tm3i
@user-er6zr1tm3i Год назад
@@math-to-masses ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-cUxY7xiE2y0.html
@v61kz
@v61kz Год назад
А какое остаётся неиспользованным?😮
@redfox7193
@redfox7193 4 месяца назад
Тем не менее (код C#) Console.WriteLine(1.4f + 2.6f); выдает в консоле 4, а не 3.9999 А Console.WriteLine(1.4f + 2.6f == 4f); выдает True.
@padla6304
@padla6304 Год назад
1.4 + 2.6 = 14/10 + 26/10 = 7/5 + 13/5 = 20/5 = 4/1 = 4
@justafish_
@justafish_ 11 месяцев назад
12:17 в принципе логично, (1.2345 * 10 ^ 100) + (9.999 * 10 ^ 10 ^ (-100)) примерно равно 1.2345 * 10 ^ 100
@Danil_Dm
@Danil_Dm Год назад
Если честно то мне обыкновенные дроби были сложнее чем десятичные, наверное потому что я уже программировать умел когда их изучал
@papacrow3854
@papacrow3854 Год назад
Хорошо объясняешь. Хотелось бы от тебя услышать, как python хранит очень большие числа. К примеру, у C++ есть предел
@Hobbitangle
@Hobbitangle 9 месяцев назад
python, как впрочем и C++, "большие числа" не хранит. Равно как и "малые числа" он тоже не хранит. Числа - большия и малыя - хранит компьютер. Точнее говоря, процессор, а ещё точнее говоря - математический сопроцессор (FPU). Хранит он эти числа в формате с "плавающей запятой" о чём собственно и ролик выше. Этот же сопроцессор обеспечивает базовый набор операций над числами - сложение, умножение, деление, а также вычисление элементарных функций, к которым потом и обращаются языки программирования, включая python, C++, Fortran, Basic и прочая, прочая, прочая, число им легион.
@papacrow3854
@papacrow3854 9 месяцев назад
@@Hobbitangle ну все равно как? Почему на python я могу посчитать 100! И результат выводится, а C++ в этом ограничен. Он в один момент (в зависимости от размера переменной) начнет "зацикливать расчёт" И выдаст результат в пределах своей переменной. Хотя, возможно у C++ другие задачи были, поэтому сделали так
@Hobbitangle
@Hobbitangle 9 месяцев назад
@@papacrow3854 "И выдаст результат в пределах своей переменной" Ой. "результат в пределах переменной". Даже не знаю как комментировать это выражение. Ладно. Пойдем другим путём. Начнём с того что ни Питон, ни C++ выражение 100! непосредственно не вычисляют. Нет такого оператора в языке, ни в том и ни в другом. "Факториал" - это есть, или точнее говоря, может быть, _функция_ которую ещё нужно определить, причём это можно сделать по разному. Например, при помощи циклического умножения - или ещё как. Что касается "результата в пределах переменной" (буду использовать твоё безграмотное выражение). значение 100! находится в пределах 10²⁰⁰ , ьчто вполне допустимое значение для числа с плавающей запятой двойной точности 10³⁰⁰ Т.е. и там и там, и в питоне и на C++ результат может быть получен "в пределах переменной" Тут вопрос только в том как составить такую функцию. Если в качестве промежуточной переменной ты будешь использовать переменную , принимающую целочисленные значения, ты получишь в итоге переполнение разрядной сетки и неопределенный результат. А если сразу использовать числа с плавающей запятой, то результат будет корректным. вот тебе код на C++: int factorial (int n) { int temp = 1; for (i=2: i
@papacrow3854
@papacrow3854 9 месяцев назад
@@Hobbitangle я написал 100! Для примера большого числа. Я не имел ввиду, что сразу вычислит
@user-sz4fn9vh8s
@user-sz4fn9vh8s 8 месяцев назад
​@@Hobbitangleну как бы, в Пайтон такой оператор есть, который вычисляет факториал
@sergeigarbar1896
@sergeigarbar1896 Год назад
1) классно. 2) я больше не хочу быть программистом
@math-to-masses
@math-to-masses Год назад
Да наоборот же! Когда знаешь, как оно устроено, тогда столько всего классного можно напрограммировать! :)
@sergeigarbar1896
@sergeigarbar1896 Год назад
@@math-to-masses это была шутка. если серьёпзно - я думал что операции с числами мне хватит 32Bits RAM in Digital Logic Sim #digitallogic 7 Segment Display in Digital Logic Sim и истальных видео по digital Logic Simulator . я думал что например 5.5 это + 0011 0111 х 10 -2 ( + 55 умножить на 10 в минус второй)
@SuperMario-is5rj
@SuperMario-is5rj Год назад
Эти толпы битов с удовольствием кушает процессор, а не программист. Программист щёлкает кнутом и говорит: " але-ап, добудь мне sin(3.14/2) " и кланяется 😁😁
@iamzeus1250
@iamzeus1250 Год назад
Нормик
@ekselenUi
@ekselenUi Год назад
Спасибо Вам за ролик!) Скажите пожалуйста, как калькулятор, например гугловский на Андроид, записывает дробное число для дальнейших вычислений? Точнее у меня этот вопрос к следующему примеру. Последовательно делаем следующие операции: делим десять на три, нажимаем равно, умножаем результат на три и получаем 10 вместо 9,999~. Чтобы получить десять калькулятор должен отметить себе что 10 / 3 = ⅓ от 10, но как это он себе отмечает? Спасибо Вам!
@math-to-masses
@math-to-masses Год назад
Я не уверен, поскольку разных видов калькуляторов огромное множество. У меня тут есть два варианта: либо у калькулятора по-другому хранятся в памяти и в процессоре (это, кстати, логично, ведь калькулятору не нужно так же сильно ускорять вычисления, как компьютеру), либо он умеет добавлять какое-то небольшое число эпсилон, если он понимает, что такое добавление округлит число
@ekselenUi
@ekselenUi Год назад
@@math-to-masses Спасибо Вам за ответ, Антон! А может у него есть что-то вроде списка случаев, когда период в десятичной дроби нужно отметить как дробную часть от целого числа.
@ekselenUi
@ekselenUi Год назад
@@math-to-masses В принципе, как-то ведь калькулятор должен хранить дроби с периодом.
@ekselenUi
@ekselenUi Год назад
@@math-to-masses Число эпсилон - это интересный вариант. Спасибо!
@math-to-masses
@math-to-masses Год назад
@@ekselenUi я бы ставил на то, что у калькулятора дроби хранятся не как одно число с плавающей точкой, а как отдельно целый числитель и отдельно целый знаменатель. Как быть с иррациональными числами, правда, в такой парадигме - не очень понятно, не знаю. Думаю, что специалисты по транзисторам и процессорам тут подскажут подробнее
@alex-j476
@alex-j476 Год назад
давай еще больше инфы
@mishkaD23
@mishkaD23 5 месяцев назад
Почему же тогда в C++ при сложении двух float выдаёт 4? Получается, в наше время проблема решена уже, а ты рассказываешь что нет и всем кранты.
@Serhii_Volchetskyi
@Serhii_Volchetskyi Год назад
Хотелось б про коррекцию ошибок услшать
@45485
@45485 Год назад
ты на природе снимаешь?
@user-uj8bg9ek7z
@user-uj8bg9ek7z Год назад
Довольно странное утверждение, что в школе сложно давались десятичные дроби. Мне наоборот с десятичными было все предельно понятно и просто, а вот с простыми головная боль. С десятичными как раз всё просто. Есть целое количество (яблок) и какая-то ещё часть (яблока) в диапазоне от 0 до 1, где 0.5, это половина яблока, а 0.25 четверть и так далее. С простыми же до сих пор иногда проблемы возникают. Но может это просто я один такой "неправильный" и всем людям проще простые дроби, а с десятичными проблемы.
@user-kj1yy7jk8l
@user-kj1yy7jk8l Год назад
А про денормализованные числа?
@math-to-masses
@math-to-masses Год назад
справедливо, тут не рассказал. Вы молодец, что вспомнили :)
@nexonnera.k.a.8796
@nexonnera.k.a.8796 Год назад
Такое чувство когда учил десятичные роби раньше обычных:
@wrrr1256
@wrrr1256 Год назад
в прошлом семестре на экзамене по информатике получил 5, только сейчас понял за что💀
@JohnJTraston
@JohnJTraston Год назад
Нееее... ну ты сразу прям float. Есть еще числа с фиксированой точкой - дофига где в кодеках, DSP, микроконтроллерах используется. Есть в виде рациональных дробей, целочисленные числитель со знаменателем. Тоже много где в embedded технике используется. Да пол Exifа в таком виде записано.
@soyeraccount
@soyeraccount Год назад
А есть ли способ точно проводить операции с дробными числами?
@math-to-masses
@math-to-masses Год назад
Первый способ - использовать double. Второй способ - реализовать собственный формат хранения чисел, но увеличить время, затраченное на вычисление
@user-cy3do4xc2c
@user-cy3do4xc2c Год назад
Python поддерживает тип Decimal. Подробности в PEP 327
@user-sz4fn9vh8s
@user-sz4fn9vh8s 8 месяцев назад
Так и не сказал, а как же их хранить. То, что они там лежат так, что сам чёрт ногу сломит - это понятно. А как мне, например, воспроизвести на компьютере любой знак после запятой числа Пи?
@user-er6zr1tm3i
@user-er6zr1tm3i Год назад
Ты втираешь мне какую-то дичь!
@Ritefita
@Ritefita Год назад
нафига у 1.4 и 1.6 сравнивать порядки, если он у них один? как вышло что разный?
@math-to-masses
@math-to-masses Год назад
там 1.4 и 2.6 складываются. У них разные порядки. У 1.4 и 1.6 действительно порядки одинаковые
@Ritefita
@Ritefita Год назад
@@math-to-masses спасибо. у 1.4 и 2.6 тоже одинаковые порядки, относительно точки. Эх, надо было вовремя выключать))
@math-to-masses
@math-to-masses Год назад
@@Ritefita в десятичной системе счисления - одинаковые - у них порядок единиц (десять уже не влезает в эти числа). А в двоичной системе счисления в 1.4 влезают единица, а двойка уже не влезает. А в 2.6 влезает уже двойка. Так что 2.6 в двоичной системе на 1 порядок больше, чем число 1.4
@user-xv5to8tz9r
@user-xv5to8tz9r Год назад
Блин, как ты мнимое число запишешь? у него же нет знака
@math-to-masses
@math-to-masses Год назад
Мнимое число в таком формате, конечно, не запишешь, это правда. Чтобы сохранить в памяти мнимое число, нужно два числа в формате флоат
@nickzweng7299
@nickzweng7299 Год назад
float f1 = 1.4; float f2 = 2.6; float f3; float sum_f(float ff1, float ff2) { return ff1 + ff2; } int main() { printf("Hello World %f ", (1.6+2.4)); printf("Hello World %f ", (f1+f2)); f3 = f1 + f2; printf("Hello World %f ", f3); f3 = sum_f(f1, f2); printf("Hello World %f ", f3); return 0; }
@nickzweng7299
@nickzweng7299 Год назад
Hello World 4.000000 Hello World 4.000000 Hello World 4.000000 Hello World 4.000000 ...Program finished with exit code 0 Press ENTER to exit console.
@dageon3127
@dageon3127 Год назад
ХАХАХААХА python при складывании 1.4 + 2.6 выдает 4
@alexeidubrovin5234
@alexeidubrovin5234 Год назад
Не раскрыта тема с (+/-) 0/∞/NaN !
@math-to-masses
@math-to-masses Год назад
Справедливо, надо будет дополнить
@donevil8582
@donevil8582 Год назад
Видео крутые конечно, но обидно как-то, когда ты зрителя недоумком изображаешь.
@math-to-masses
@math-to-masses Год назад
честно говоря, здесь я показываю себя, как бы "я, который не в теме" отреагировал на "меня, который в теме" :)
@yohohowowowo9471
@yohohowowowo9471 Год назад
А я то думаю, почему в программах 0,333 и 0,666 и им подобные так часто вылезают, а оно вон что)
Далее
Самые большие числа
18:22
Просмотров 1,9 млн
ИСТОРИЯ ОДНОГО КИЛОБАЙТА
11:26
Просмотров 806 тыс.