Благодарю за такое точное и понятное объяснение! Я рада, что вы мне попались! До вас я находила видео с разборами на эту тему, но они были все долгие и непонятные. У вас талант объяснить сложное простым языком ❤
Благодарю вас, Антон. У вас - талант объяснять. И талант блогера. Вы можете объяснять довольно скучные (для непосвященных) темы очень увлекательно. Темы роликов у вас - для меня - актуальные. Подписался на вас!
Не так часто пишу комментарии, но тут не могу не заметить, что навыки объяснения у автора на отличном уровне) Не скажу, что тема сильно сложная, но непросвящённому человеку куда приятнее воспринимать такой контент с наглядными объяснениями, чем в исключительно формульном виде.
Молодец, расширил мои познания, спасибо. Видео понравилось и ещё понравилось видео, где разработчики игры решили обойти использование квадратного корня с помощью хитрой конструкции. Вообщем, разбор деталей очень интересен. Может расскажешь, как компьютер проводит операцию квадратного корня?
3:55 как по мне это наоборот более правильная и логичная форма, чем у дополнительного кода, в ней 1000 > 0000, потому что старший разряд в первом числе больше, чем во втором. Это то, как работают числа в любой системе счисления. А вот в дополнительном коде у нас почему то 0000 > 1000 (потому что старший разряд - это знак, да еще и чем он больше, тем число меньше)
вычитать -127 нужно для хранения отрицательной экспоненты. Конечно можно было бы использовать sign бит, но тогда бы у нас экспонента лежала бы в диапазоне (-127, +127) так как два значения(10000000 и 00000000, они же +0 и -0 в десятичной) были эквивалентны. Если же мы вычитаем 127, то получаем значение экспоненты в диапазоне (-127, +128), а значит что неиспользованное значение может служит идентификатором NaN и Infinity.
python, как впрочем и C++, "большие числа" не хранит. Равно как и "малые числа" он тоже не хранит. Числа - большия и малыя - хранит компьютер. Точнее говоря, процессор, а ещё точнее говоря - математический сопроцессор (FPU). Хранит он эти числа в формате с "плавающей запятой" о чём собственно и ролик выше. Этот же сопроцессор обеспечивает базовый набор операций над числами - сложение, умножение, деление, а также вычисление элементарных функций, к которым потом и обращаются языки программирования, включая python, C++, Fortran, Basic и прочая, прочая, прочая, число им легион.
@@Hobbitangle ну все равно как? Почему на python я могу посчитать 100! И результат выводится, а C++ в этом ограничен. Он в один момент (в зависимости от размера переменной) начнет "зацикливать расчёт" И выдаст результат в пределах своей переменной. Хотя, возможно у C++ другие задачи были, поэтому сделали так
@@papacrow3854 "И выдаст результат в пределах своей переменной" Ой. "результат в пределах переменной". Даже не знаю как комментировать это выражение. Ладно. Пойдем другим путём. Начнём с того что ни Питон, ни C++ выражение 100! непосредственно не вычисляют. Нет такого оператора в языке, ни в том и ни в другом. "Факториал" - это есть, или точнее говоря, может быть, _функция_ которую ещё нужно определить, причём это можно сделать по разному. Например, при помощи циклического умножения - или ещё как. Что касается "результата в пределах переменной" (буду использовать твоё безграмотное выражение). значение 100! находится в пределах 10²⁰⁰ , ьчто вполне допустимое значение для числа с плавающей запятой двойной точности 10³⁰⁰ Т.е. и там и там, и в питоне и на C++ результат может быть получен "в пределах переменной" Тут вопрос только в том как составить такую функцию. Если в качестве промежуточной переменной ты будешь использовать переменную , принимающую целочисленные значения, ты получишь в итоге переполнение разрядной сетки и неопределенный результат. А если сразу использовать числа с плавающей запятой, то результат будет корректным. вот тебе код на C++: int factorial (int n) { int temp = 1; for (i=2: i
Спасибо Вам за ролик!) Скажите пожалуйста, как калькулятор, например гугловский на Андроид, записывает дробное число для дальнейших вычислений? Точнее у меня этот вопрос к следующему примеру. Последовательно делаем следующие операции: делим десять на три, нажимаем равно, умножаем результат на три и получаем 10 вместо 9,999~. Чтобы получить десять калькулятор должен отметить себе что 10 / 3 = ⅓ от 10, но как это он себе отмечает? Спасибо Вам!
Я не уверен, поскольку разных видов калькуляторов огромное множество. У меня тут есть два варианта: либо у калькулятора по-другому хранятся в памяти и в процессоре (это, кстати, логично, ведь калькулятору не нужно так же сильно ускорять вычисления, как компьютеру), либо он умеет добавлять какое-то небольшое число эпсилон, если он понимает, что такое добавление округлит число
@@math-to-masses Спасибо Вам за ответ, Антон! А может у него есть что-то вроде списка случаев, когда период в десятичной дроби нужно отметить как дробную часть от целого числа.
@@timurbrave я бы ставил на то, что у калькулятора дроби хранятся не как одно число с плавающей точкой, а как отдельно целый числитель и отдельно целый знаменатель. Как быть с иррациональными числами, правда, в такой парадигме - не очень понятно, не знаю. Думаю, что специалисты по транзисторам и процессорам тут подскажут подробнее
Довольно странное утверждение, что в школе сложно давались десятичные дроби. Мне наоборот с десятичными было все предельно понятно и просто, а вот с простыми головная боль. С десятичными как раз всё просто. Есть целое количество (яблок) и какая-то ещё часть (яблока) в диапазоне от 0 до 1, где 0.5, это половина яблока, а 0.25 четверть и так далее. С простыми же до сих пор иногда проблемы возникают. Но может это просто я один такой "неправильный" и всем людям проще простые дроби, а с десятичными проблемы.
@@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 в минус второй)
Эти толпы битов с удовольствием кушает процессор, а не программист. Программист щёлкает кнутом и говорит: " але-ап, добудь мне sin(3.14/2) " и кланяется 😁😁
@@Ritefita в десятичной системе счисления - одинаковые - у них порядок единиц (десять уже не влезает в эти числа). А в двоичной системе счисления в 1.4 влезают единица, а двойка уже не влезает. А в 2.6 влезает уже двойка. Так что 2.6 в двоичной системе на 1 порядок больше, чем число 1.4
Так и не сказал, а как же их хранить. То, что они там лежат так, что сам чёрт ногу сломит - это понятно. А как мне, например, воспроизвести на компьютере любой знак после запятой числа Пи?
Нееее... ну ты сразу прям float. Есть еще числа с фиксированой точкой - дофига где в кодеках, DSP, микроконтроллерах используется. Есть в виде рациональных дробей, целочисленные числитель со знаменателем. Тоже много где в embedded технике используется. Да пол Exifа в таком виде записано.
Благодарю за такое точное и понятное объяснение! Я рада, что вы мне попались! До вас я находила видео с разборами на эту тему, но они были все долгие и непонятные. У вас талант объяснить сложное простым языком ❤
Благодарю вас, Антон. У вас - талант объяснять. И талант блогера. Вы можете объяснять довольно скучные (для непосвященных) темы очень увлекательно. Темы роликов у вас - для меня - актуальные. Подписался на вас!
Понравилось. Отдельное спасибо за музыку на фоне :)
Антон, рад что наткнулся на ваш канал, очень понятно объясняете.
Местами кринжанул со скетчей, может это только я такой)
Продолжайте, очень интересно!
Вот, мы тут восхищаемся красотой технических решений, а некоторые становятся миллионерами благодаря этим случайным циферкам после запятой 😅
Я хочу еще таких видосов! Это настолько круто, что хочется снова и снова!
Браво за объяснение таких вещей. Мне нравится!
Прелесть какое хорошее разъяснение. Не душно и по факту!
Спасибо! ^^
Не так часто пишу комментарии, но тут не могу не заметить, что навыки объяснения у автора на отличном уровне) Не скажу, что тема сильно сложная, но непросвящённому человеку куда приятнее воспринимать такой контент с наглядными объяснениями, чем в исключительно формульном виде.
Классный видос!
А на моменте экономии бита я прям сам захотел танцевать
Какое кайфовое объяснение
Огонь! Я прям вспоминаю уроки по С++ в десятом классе)
Спасибо за видео!
Насчёт странного способа записи порядка: весь стандарт float основан на том, чтобы числа можно было сравнивать как целые.
Интересное видео) Было бы очень круто, если бы вы рассказали про нейросети в следующих видео!
Спасибо!
Я точно расскажу об этом, как только придумаю, как это сделать без духоты :)
Молодец, расширил мои познания, спасибо.
Видео понравилось и ещё понравилось видео, где разработчики игры решили обойти использование квадратного корня с помощью хитрой конструкции. Вообщем, разбор деталей очень интересен.
Может расскажешь, как компьютер проводит операцию квадратного корня?
3:55 как по мне это наоборот более правильная и логичная форма, чем у дополнительного кода, в ней 1000 > 0000, потому что старший разряд в первом числе больше, чем во втором. Это то, как работают числа в любой системе счисления. А вот в дополнительном коде у нас почему то 0000 > 1000 (потому что старший разряд - это знак, да еще и чем он больше, тем число меньше)
Очень интересный видос!
4:14 так сделали, чтобы сортировку чисел делать быстрее.
Первый проход можно делать только по первому байту.
Сложно. Но интересно. Надо будет ещё разок пересмотреть.
Круто!!!
Целочисленная математика наше всё
А про денормализованные числа?
справедливо, тут не рассказал. Вы молодец, что вспомнили :)
1) классно. 2) я еще больше стать прораммистом
вычитать -127 нужно для хранения отрицательной экспоненты. Конечно можно было бы использовать sign бит, но тогда бы у нас экспонента лежала бы в диапазоне (-127, +127) так как два значения(10000000 и 00000000, они же +0 и -0 в десятичной) были эквивалентны. Если же мы вычитаем 127, то получаем значение экспоненты в диапазоне (-127, +128), а значит что неиспользованное значение может служит идентификатором NaN и Infinity.
Блин, это так просто и логично. Почему я сам не догадался! Спасибо!
@@math-to-masses ruclips.net/video/cUxY7xiE2y0/видео.html
А какое остаётся неиспользованным?😮
Спасибо, автору, но нужно больше времени просты вставкам-наглядным
Хорошо объясняешь. Хотелось бы от тебя услышать, как python хранит очень большие числа. К примеру, у C++ есть предел
python, как впрочем и C++, "большие числа" не хранит. Равно как и "малые числа" он тоже не хранит. Числа - большия и малыя - хранит компьютер. Точнее говоря, процессор, а ещё точнее говоря - математический сопроцессор (FPU). Хранит он эти числа в формате с "плавающей запятой" о чём собственно и ролик выше.
Этот же сопроцессор обеспечивает базовый набор операций над числами - сложение, умножение, деление, а также вычисление элементарных функций, к которым потом и обращаются языки программирования, включая python, C++, Fortran, Basic и прочая, прочая, прочая, число им легион.
@@Hobbitangle ну все равно как? Почему на python я могу посчитать 100! И результат выводится, а C++ в этом ограничен. Он в один момент (в зависимости от размера переменной) начнет "зацикливать расчёт" И выдаст результат в пределах своей переменной.
Хотя, возможно у C++ другие задачи были, поэтому сделали так
@@papacrow3854
"И выдаст результат в пределах своей переменной"
Ой. "результат в пределах переменной". Даже не знаю как комментировать это выражение.
Ладно. Пойдем другим путём. Начнём с того что ни Питон, ни C++ выражение 100! непосредственно не вычисляют. Нет такого оператора в языке, ни в том и ни в другом. "Факториал" - это есть, или точнее говоря, может быть, _функция_ которую ещё нужно определить, причём это можно сделать по разному. Например, при помощи циклического умножения - или ещё как.
Что касается "результата в пределах переменной" (буду использовать твоё безграмотное выражение). значение 100! находится в пределах 10²⁰⁰ , ьчто вполне допустимое значение для числа с плавающей запятой двойной точности 10³⁰⁰
Т.е. и там и там, и в питоне и на C++ результат может быть получен "в пределах переменной"
Тут вопрос только в том как составить такую функцию.
Если в качестве промежуточной переменной ты будешь использовать переменную , принимающую целочисленные значения, ты получишь в итоге переполнение разрядной сетки и неопределенный результат. А если сразу использовать числа с плавающей запятой, то результат будет корректным.
вот тебе код на C++:
int factorial (int n) {
int temp = 1;
for (i=2: i
@@Hobbitangle я написал 100! Для примера большого числа. Я не имел ввиду, что сразу вычислит
@@Hobbitangleну как бы, в Пайтон такой оператор есть, который вычисляет факториал
Спасибо Вам за ролик!)
Скажите пожалуйста, как калькулятор, например гугловский на Андроид, записывает дробное число для дальнейших вычислений?
Точнее у меня этот вопрос к следующему примеру. Последовательно делаем следующие операции: делим десять на три, нажимаем равно, умножаем результат на три и получаем 10 вместо 9,999~.
Чтобы получить десять калькулятор должен отметить себе что 10 / 3 = ⅓ от 10, но как это он себе отмечает?
Спасибо Вам!
Я не уверен, поскольку разных видов калькуляторов огромное множество. У меня тут есть два варианта: либо у калькулятора по-другому хранятся в памяти и в процессоре (это, кстати, логично, ведь калькулятору не нужно так же сильно ускорять вычисления, как компьютеру), либо он умеет добавлять какое-то небольшое число эпсилон, если он понимает, что такое добавление округлит число
@@math-to-masses Спасибо Вам за ответ, Антон! А может у него есть что-то вроде списка случаев, когда период в десятичной дроби нужно отметить как дробную часть от целого числа.
@@math-to-masses В принципе, как-то ведь калькулятор должен хранить дроби с периодом.
@@math-to-masses Число эпсилон - это интересный вариант. Спасибо!
@@timurbrave я бы ставил на то, что у калькулятора дроби хранятся не как одно число с плавающей точкой, а как отдельно целый числитель и отдельно целый знаменатель. Как быть с иррациональными числами, правда, в такой парадигме - не очень понятно, не знаю. Думаю, что специалисты по транзисторам и процессорам тут подскажут подробнее
Красиво
Всё просто - 1.4 или 2.6 не возможно точно записать в дроичных дробях, точно так же как не возможно записать 1/3 в десятичных дробях.
ты на природе снимаешь?
12:17 в принципе логично, (1.2345 * 10 ^ 100) + (9.999 * 10 ^ 10 ^ (-100)) примерно равно 1.2345 * 10 ^ 100
Тем не менее (код C#) Console.WriteLine(1.4f + 2.6f); выдает в консоле 4, а не 3.9999
А Console.WriteLine(1.4f + 2.6f == 4f); выдает True.
Почему же тогда в C++ при сложении двух float выдаёт 4? Получается, в наше время проблема решена уже, а ты рассказываешь что нет и всем кранты.
Хотелось б про коррекцию ошибок услшать
А есть ли способ точно проводить операции с дробными числами?
Первый способ - использовать double. Второй способ - реализовать собственный формат хранения чисел, но увеличить время, затраченное на вычисление
Python поддерживает тип Decimal. Подробности в PEP 327
Если честно то мне обыкновенные дроби были сложнее чем десятичные, наверное потому что я уже программировать умел когда их изучал
Довольно странное утверждение, что в школе сложно давались десятичные дроби. Мне наоборот с десятичными было все предельно понятно и просто, а вот с простыми головная боль. С десятичными как раз всё просто. Есть целое количество (яблок) и какая-то ещё часть (яблока) в диапазоне от 0 до 1, где 0.5, это половина яблока, а 0.25 четверть и так далее. С простыми же до сих пор иногда проблемы возникают.
Но может это просто я один такой "неправильный" и всем людям проще простые дроби, а с десятичными проблемы.
1) классно. 2) я больше не хочу быть программистом
Да наоборот же! Когда знаешь, как оно устроено, тогда столько всего классного можно напрограммировать! :)
@@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 в минус второй)
Эти толпы битов с удовольствием кушает процессор, а не программист. Программист щёлкает кнутом и говорит: " але-ап, добудь мне sin(3.14/2) " и кланяется 😁😁
нафига у 1.4 и 1.6 сравнивать порядки,
если он у них один?
как вышло что разный?
там 1.4 и 2.6 складываются. У них разные порядки. У 1.4 и 1.6 действительно порядки одинаковые
@@math-to-masses спасибо.
у 1.4 и 2.6 тоже одинаковые порядки, относительно точки.
Эх, надо было вовремя выключать))
@@Ritefita в десятичной системе счисления - одинаковые - у них порядок единиц (десять уже не влезает в эти числа). А в двоичной системе счисления в 1.4 влезают единица, а двойка уже не влезает. А в 2.6 влезает уже двойка. Так что 2.6 в двоичной системе на 1 порядок больше, чем число 1.4
1.4 + 2.6 = 14/10 + 26/10 = 7/5 + 13/5 = 20/5 = 4/1 = 4
в прошлом семестре на экзамене по информатике получил 5, только сейчас понял за что💀
Нормик
Так и не сказал, а как же их хранить. То, что они там лежат так, что сам чёрт ногу сломит - это понятно. А как мне, например, воспроизвести на компьютере любой знак после запятой числа Пи?
Такое чувство когда учил десятичные роби раньше обычных:
А я то думаю, почему в программах 0,333 и 0,666 и им подобные так часто вылезают, а оно вон что)
Нееее... ну ты сразу прям float. Есть еще числа с фиксированой точкой - дофига где в кодеках, DSP, микроконтроллерах используется. Есть в виде рациональных дробей, целочисленные числитель со знаменателем. Тоже много где в embedded технике используется. Да пол Exifа в таком виде записано.
Блин, как ты мнимое число запишешь? у него же нет знака
Мнимое число в таком формате, конечно, не запишешь, это правда. Чтобы сохранить в памяти мнимое число, нужно два числа в формате флоат
давай еще больше инфы
Не раскрыта тема с (+/-) 0/∞/NaN !
Справедливо, надо будет дополнить
Ты втираешь мне какую-то дичь!
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;
}
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.
ХАХАХААХА
python при складывании 1.4 + 2.6 выдает 4
Видео крутые конечно, но обидно как-то, когда ты зрителя недоумком изображаешь.
честно говоря, здесь я показываю себя, как бы "я, который не в теме" отреагировал на "меня, который в теме" :)