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

  Рет қаралды 7,460

Антон Филатов

Антон Филатов

Күн бұрын

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

Пікірлер: 84
@user-cy3do4xc2c
@user-cy3do4xc2c Жыл бұрын
Вот, мы тут восхищаемся красотой технических решений, а некоторые становятся миллионерами благодаря этим случайным циферкам после запятой 😅
@user-ut2ii3qi6x
@user-ut2ii3qi6x Жыл бұрын
Благодарю вас, Антон. У вас - талант объяснять. И талант блогера. Вы можете объяснять довольно скучные (для непосвященных) темы очень увлекательно. Темы роликов у вас - для меня - актуальные. Подписался на вас!
@Ratmirsh
@Ratmirsh Жыл бұрын
Антон, рад что наткнулся на ваш канал, очень понятно объясняете. Местами кринжанул со скетчей, может это только я такой) Продолжайте, очень интересно!
@jtprogru_channel
@jtprogru_channel Жыл бұрын
Я хочу еще таких видосов! Это настолько круто, что хочется снова и снова!
@kemal667
@kemal667 Жыл бұрын
Насчёт странного способа записи порядка: весь стандарт float основан на том, чтобы числа можно было сравнивать как целые.
@inotak
@inotak Жыл бұрын
Браво за объяснение таких вещей. Мне нравится!
@user-mp1vd9ww3j
@user-mp1vd9ww3j Жыл бұрын
Прелесть какое хорошее разъяснение. Не душно и по факту!
@math-to-masses
@math-to-masses Жыл бұрын
Спасибо! ^^
@justafish_
@justafish_ 10 ай бұрын
3:55 как по мне это наоборот более правильная и логичная форма, чем у дополнительного кода, в ней 1000 > 0000, потому что старший разряд в первом числе больше, чем во втором. Это то, как работают числа в любой системе счисления. А вот в дополнительном коде у нас почему то 0000 > 1000 (потому что старший разряд - это знак, да еще и чем он больше, тем число меньше)
@rechw769
@rechw769 Жыл бұрын
Спасибо за видео!
@iljakot_tran4131
@iljakot_tran4131 Жыл бұрын
Классный видос! А на моменте экономии бита я прям сам захотел танцевать
@JamshidShoyusupov-fo1gm
@JamshidShoyusupov-fo1gm 4 ай бұрын
Круто!!!
@KT315A-qp9re
@KT315A-qp9re 2 ай бұрын
4:14 так сделали, чтобы сортировку чисел делать быстрее. Первый проход можно делать только по первому байту.
@sanchopansa8956
@sanchopansa8956 Жыл бұрын
Не так часто пишу комментарии, но тут не могу не заметить, что навыки объяснения у автора на отличном уровне) Не скажу, что тема сильно сложная, но непросвящённому человеку куда приятнее воспринимать такой контент с наглядными объяснениями, чем в исключительно формульном виде.
@peterl4864
@peterl4864 Жыл бұрын
Огонь! Я прям вспоминаю уроки по С++ в десятом классе)
@user-mw9gk1li1k
@user-mw9gk1li1k Жыл бұрын
Какое кайфовое объяснение
@dontyoudaredude
@dontyoudaredude Жыл бұрын
Очень интересный видос!
@-Sergey
@-Sergey Жыл бұрын
Сложно. Но интересно. Надо будет ещё разок пересмотреть.
@user-tv2kx7oy1j
@user-tv2kx7oy1j Жыл бұрын
Интересное видео) Было бы очень круто, если бы вы рассказали про нейросети в следующих видео!
@math-to-masses
@math-to-masses Жыл бұрын
Спасибо! Я точно расскажу об этом, как только придумаю, как это сделать без духоты :)
@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 kzbin.info/www/bejne/mYbbimqunqplr5I
@v61kz
@v61kz Жыл бұрын
А какое остаётся неиспользованным?😮
@borisvalerievich5831
@borisvalerievich5831 Жыл бұрын
Целочисленная математика наше всё
@arm_128bit
@arm_128bit Жыл бұрын
Молодец, расширил мои познания, спасибо. Видео понравилось и ещё понравилось видео, где разработчики игры решили обойти использование квадратного корня с помощью хитрой конструкции. Вообщем, разбор деталей очень интересен. Может расскажешь, как компьютер проводит операцию квадратного корня?
@barcek2281
@barcek2281 Жыл бұрын
1) классно. 2) я еще больше стать прораммистом
@redfox7193
@redfox7193 3 ай бұрын
Тем не менее (код C#) Console.WriteLine(1.4f + 2.6f); выдает в консоле 4, а не 3.9999 А Console.WriteLine(1.4f + 2.6f == 4f); выдает True.
@programm1ct
@programm1ct Жыл бұрын
Всё просто - 1.4 или 2.6 не возможно точно записать в дроичных дробях, точно так же как не возможно записать 1/3 в десятичных дробях.
@zzubra8802
@zzubra8802 Жыл бұрын
Красиво
@mishkaD23
@mishkaD23 4 ай бұрын
Почему же тогда в C++ при сложении двух float выдаёт 4? Получается, в наше время проблема решена уже, а ты рассказываешь что нет и всем кранты.
@justafish_
@justafish_ 10 ай бұрын
12:17 в принципе логично, (1.2345 * 10 ^ 100) + (9.999 * 10 ^ 10 ^ (-100)) примерно равно 1.2345 * 10 ^ 100
@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 я бы ставил на то, что у калькулятора дроби хранятся не как одно число с плавающей точкой, а как отдельно целый числитель и отдельно целый знаменатель. Как быть с иррациональными числами, правда, в такой парадигме - не очень понятно, не знаю. Думаю, что специалисты по транзисторам и процессорам тут подскажут подробнее
@padla6304
@padla6304 Жыл бұрын
1.4 + 2.6 = 14/10 + 26/10 = 7/5 + 13/5 = 20/5 = 4/1 = 4
@user-kj1yy7jk8l
@user-kj1yy7jk8l Жыл бұрын
А про денормализованные числа?
@math-to-masses
@math-to-masses Жыл бұрын
справедливо, тут не рассказал. Вы молодец, что вспомнили :)
@45485
@45485 Жыл бұрын
ты на природе снимаешь?
@Danil_Dm
@Danil_Dm Жыл бұрын
Если честно то мне обыкновенные дроби были сложнее чем десятичные, наверное потому что я уже программировать умел когда их изучал
@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) " и кланяется 😁😁
@papacrow3854
@papacrow3854 Жыл бұрын
Хорошо объясняешь. Хотелось бы от тебя услышать, как python хранит очень большие числа. К примеру, у C++ есть предел
@Hobbitangle
@Hobbitangle 8 ай бұрын
python, как впрочем и C++, "большие числа" не хранит. Равно как и "малые числа" он тоже не хранит. Числа - большия и малыя - хранит компьютер. Точнее говоря, процессор, а ещё точнее говоря - математический сопроцессор (FPU). Хранит он эти числа в формате с "плавающей запятой" о чём собственно и ролик выше. Этот же сопроцессор обеспечивает базовый набор операций над числами - сложение, умножение, деление, а также вычисление элементарных функций, к которым потом и обращаются языки программирования, включая python, C++, Fortran, Basic и прочая, прочая, прочая, число им легион.
@papacrow3854
@papacrow3854 8 ай бұрын
@@Hobbitangle ну все равно как? Почему на python я могу посчитать 100! И результат выводится, а C++ в этом ограничен. Он в один момент (в зависимости от размера переменной) начнет "зацикливать расчёт" И выдаст результат в пределах своей переменной. Хотя, возможно у C++ другие задачи были, поэтому сделали так
@Hobbitangle
@Hobbitangle 8 ай бұрын
@@papacrow3854 "И выдаст результат в пределах своей переменной" Ой. "результат в пределах переменной". Даже не знаю как комментировать это выражение. Ладно. Пойдем другим путём. Начнём с того что ни Питон, ни C++ выражение 100! непосредственно не вычисляют. Нет такого оператора в языке, ни в том и ни в другом. "Факториал" - это есть, или точнее говоря, может быть, _функция_ которую ещё нужно определить, причём это можно сделать по разному. Например, при помощи циклического умножения - или ещё как. Что касается "результата в пределах переменной" (буду использовать твоё безграмотное выражение). значение 100! находится в пределах 10²⁰⁰ , ьчто вполне допустимое значение для числа с плавающей запятой двойной точности 10³⁰⁰ Т.е. и там и там, и в питоне и на C++ результат может быть получен "в пределах переменной" Тут вопрос только в том как составить такую функцию. Если в качестве промежуточной переменной ты будешь использовать переменную , принимающую целочисленные значения, ты получишь в итоге переполнение разрядной сетки и неопределенный результат. А если сразу использовать числа с плавающей запятой, то результат будет корректным. вот тебе код на C++: int factorial (int n) { int temp = 1; for (i=2: i
@papacrow3854
@papacrow3854 8 ай бұрын
@@Hobbitangle я написал 100! Для примера большого числа. Я не имел ввиду, что сразу вычислит
@user-sz4fn9vh8s
@user-sz4fn9vh8s 7 ай бұрын
​@@Hobbitangleну как бы, в Пайтон такой оператор есть, который вычисляет факториал
@iamzeus1250
@iamzeus1250 Жыл бұрын
Нормик
@soyeraccount
@soyeraccount Жыл бұрын
А есть ли способ точно проводить операции с дробными числами?
@math-to-masses
@math-to-masses Жыл бұрын
Первый способ - использовать double. Второй способ - реализовать собственный формат хранения чисел, но увеличить время, затраченное на вычисление
@user-cy3do4xc2c
@user-cy3do4xc2c Жыл бұрын
Python поддерживает тип Decimal. Подробности в PEP 327
@Serhii_Volchetskyi
@Serhii_Volchetskyi Жыл бұрын
Хотелось б про коррекцию ошибок услшать
@alex-j476
@alex-j476 Жыл бұрын
давай еще больше инфы
@user-uj8bg9ek7z
@user-uj8bg9ek7z Жыл бұрын
Довольно странное утверждение, что в школе сложно давались десятичные дроби. Мне наоборот с десятичными было все предельно понятно и просто, а вот с простыми головная боль. С десятичными как раз всё просто. Есть целое количество (яблок) и какая-то ещё часть (яблока) в диапазоне от 0 до 1, где 0.5, это половина яблока, а 0.25 четверть и так далее. С простыми же до сих пор иногда проблемы возникают. Но может это просто я один такой "неправильный" и всем людям проще простые дроби, а с десятичными проблемы.
@wrrr1256
@wrrr1256 Жыл бұрын
в прошлом семестре на экзамене по информатике получил 5, только сейчас понял за что💀
@nexonnera.k.a.8796
@nexonnera.k.a.8796 Жыл бұрын
Такое чувство когда учил десятичные роби раньше обычных:
@JohnJTraston
@JohnJTraston Жыл бұрын
Нееее... ну ты сразу прям float. Есть еще числа с фиксированой точкой - дофига где в кодеках, DSP, микроконтроллерах используется. Есть в виде рациональных дробей, целочисленные числитель со знаменателем. Тоже много где в embedded технике используется. Да пол Exifа в таком виде записано.
@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 Жыл бұрын
Мнимое число в таком формате, конечно, не запишешь, это правда. Чтобы сохранить в памяти мнимое число, нужно два числа в формате флоат
@user-sz4fn9vh8s
@user-sz4fn9vh8s 7 ай бұрын
Так и не сказал, а как же их хранить. То, что они там лежат так, что сам чёрт ногу сломит - это понятно. А как мне, например, воспроизвести на компьютере любой знак после запятой числа Пи?
@user-er6zr1tm3i
@user-er6zr1tm3i Жыл бұрын
Ты втираешь мне какую-то дичь!
@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.
@alexeidubrovin5234
@alexeidubrovin5234 Жыл бұрын
Не раскрыта тема с (+/-) 0/∞/NaN !
@math-to-masses
@math-to-masses Жыл бұрын
Справедливо, надо будет дополнить
@dageon3127
@dageon3127 Жыл бұрын
ХАХАХААХА python при складывании 1.4 + 2.6 выдает 4
@donevil8582
@donevil8582 Жыл бұрын
Видео крутые конечно, но обидно как-то, когда ты зрителя недоумком изображаешь.
@math-to-masses
@math-to-masses Жыл бұрын
честно говоря, здесь я показываю себя, как бы "я, который не в теме" отреагировал на "меня, который в теме" :)
@yohohowowowo9471
@yohohowowowo9471 Жыл бұрын
А я то думаю, почему в программах 0,333 и 0,666 и им подобные так часто вылезают, а оно вон что)
Normal vs Smokers !! 😱😱😱
00:12
Tibo InShape
Рет қаралды 113 МЛН
Кәріс тіріма өзі ?  | Synyptas 3 | 8 серия
24:47
kak budto
Рет қаралды 1,7 МЛН
Follow @karina-kola please 🙏🥺
00:21
Andrey Grechka
Рет қаралды 25 МЛН
О, сосисочки! (Или корейская уличная еда?)
00:32
Кушать Хочу
Рет қаралды 7 МЛН
4. Работа с числами
11:11
Маткульт-привет! :: Алексей Савватеев и Ко
Рет қаралды 33 М.
Что такое Бит?
1:48
как бы школа
Рет қаралды 17 М.
Кватернионы | Вращение в 3D [Самая суть]
13:08
Антон Филатов
Рет қаралды 19 М.
Rotations in 3D Graphics With Quaternions
8:23
Manifolds in Maryland
Рет қаралды 5 М.
Как программисты числа сломали?!
11:38
Как пройти в IT?
Рет қаралды 17 М.
Как вычитать отрицательные числа? / Простые примеры из жизни по математике
10:14
Женя Копытов ЕГЭ и ОГЭ по математике
Рет қаралды 26 М.
Normal vs Smokers !! 😱😱😱
00:12
Tibo InShape
Рет қаралды 113 МЛН