‼️ Мантисса (или дробная часть) — это часть числа, которая определяет его точность. Я уже упомянул стандарт IEEE-754, согласно этому стандарту, двоичное число представляется в виде формулы, где s — знак числа, M — мантисса, B — основание, E — экспонента (порядок, степень двойки).
⭕️ Поскольку мы работаем в двоичном коде, основание равно двум, и формула принимает следующий вид: [2]. Вещественное число мы сохраняем как три отдельных числа: знак, экспоненту и мантиссу, да и все бы заебись, но количество бит для хранения ограниченно форматом.
👨💻Формат если че это такая структура, которая описывает, как именно должны быть организованны данные. ❗️Именно формат определяет, сколько битов выделяется для различных частей данных: для мантиссы, знака и порядка(экспоненты).
0️⃣ Рассматриваем формат, в котором доступно 32 бита: 1 бит знака, 8 битов для экспоненты и 23 бита для мантиссы. Этот формат называется ‼️"одинарной точностью". Также есть формат 'Двойная точность (64 бита)': 1 бит для знака, 11 битов для экспоненты, 52 бита для мантиссы.
⁉️Дак вот, нам нужно сдвинуть запятую нашего числа с прошлого поста 110.01 влево настолько, пока в целой части не останется единица. При этом, каждый сдвиг увеличивает степень основания (сейчас поясню).
1️⃣ На первом этапе у нас число 110.01 * 10 ** 0, все написано по формуле! Десятка в основании, так как это 2 в двоичной степени, сам автор статьи это поясняет. Следующим этапом будет сдвиг запятой влево, т.е получится 11.001 * 10 ** 1.
2️⃣Ну и последним этапом, 1.1001 * 10 ** 2. В итоге мы получаем
1.1001 x 2 ** 2. (По сути просто сдвигаем влево и увеличиваем степень нашей '2')
Здесь 1.1001 - это наша мантисса, а поскольку наше число положительное, бит знака будет равен 0.
На этом этапе хочу поблагодарить автора статьи, потому что лично я узнал немало нового и делюсь этим с вами.
‼️Чтобы дальше получить экспоненту, нам нужно прибавить число 127. То есть было у нас число 1.1001 * 2 ** 2, к этой двойке прибавляем 127, с каких это х‼️ев?
🔗Под экспоненту в нашем представлении чисел с плавающей запятой выделено 8 бит, что позволяет сохранить 256 различных значений. Но есть проблемка, ведь в нашем представлении не предусмотрено отдельного бита для знака экспоненты.
‼️Решением проблемы будет состоять в хранении экспоненты относительно середины доступного диапазона значений, то есть диапазон чисел от 0 до 255, а для 8-битного диапазона этой "серединой" будет число 127 [3] изображение.
3️⃣ По итогу, к нашей изначальной степени 2 прибавляем 127 и получаем 129. При преобразовании 129 в двоичную получаем 10000001 - это и будет экспонента. Зачем вообще это все нужно ?
Ответ - да х🌶й знает вообще, мне лично стало интересно почитать и изучить, как это работает в действительности, а не просто 'а нуу, 0.1 + 0.1 не равно 0.2 да и ладно, написано, значит написано'. Спасибо большое автору статьи! Сейчас скину пару изображений и перейдем к финалу
⭕️ Поскольку мы работаем в двоичном коде, основание равно двум, и формула принимает следующий вид: [2]. Вещественное число мы сохраняем как три отдельных числа: знак, экспоненту и мантиссу, да и все бы заебись, но количество бит для хранения ограниченно форматом.
👨💻Формат если че это такая структура, которая описывает, как именно должны быть организованны данные. ❗️Именно формат определяет, сколько битов выделяется для различных частей данных: для мантиссы, знака и порядка(экспоненты).
0️⃣ Рассматриваем формат, в котором доступно 32 бита: 1 бит знака, 8 битов для экспоненты и 23 бита для мантиссы. Этот формат называется ‼️"одинарной точностью". Также есть формат 'Двойная точность (64 бита)': 1 бит для знака, 11 битов для экспоненты, 52 бита для мантиссы.
⁉️Дак вот, нам нужно сдвинуть запятую нашего числа с прошлого поста 110.01 влево настолько, пока в целой части не останется единица. При этом, каждый сдвиг увеличивает степень основания (сейчас поясню).
1️⃣ На первом этапе у нас число 110.01 * 10 ** 0, все написано по формуле! Десятка в основании, так как это 2 в двоичной степени, сам автор статьи это поясняет. Следующим этапом будет сдвиг запятой влево, т.е получится 11.001 * 10 ** 1.
2️⃣Ну и последним этапом, 1.1001 * 10 ** 2. В итоге мы получаем
1.1001 x 2 ** 2. (По сути просто сдвигаем влево и увеличиваем степень нашей '2')
Здесь 1.1001 - это наша мантисса, а поскольку наше число положительное, бит знака будет равен 0.
На этом этапе хочу поблагодарить автора статьи, потому что лично я узнал немало нового и делюсь этим с вами.
‼️Чтобы дальше получить экспоненту, нам нужно прибавить число 127. То есть было у нас число 1.1001 * 2 ** 2, к этой двойке прибавляем 127, с каких это х‼️ев?
🔗Под экспоненту в нашем представлении чисел с плавающей запятой выделено 8 бит, что позволяет сохранить 256 различных значений. Но есть проблемка, ведь в нашем представлении не предусмотрено отдельного бита для знака экспоненты.
‼️Решением проблемы будет состоять в хранении экспоненты относительно середины доступного диапазона значений, то есть диапазон чисел от 0 до 255, а для 8-битного диапазона этой "серединой" будет число 127 [3] изображение.
3️⃣ По итогу, к нашей изначальной степени 2 прибавляем 127 и получаем 129. При преобразовании 129 в двоичную получаем 10000001 - это и будет экспонента. Зачем вообще это все нужно ?
Ответ - да х🌶й знает вообще, мне лично стало интересно почитать и изучить, как это работает в действительности, а не просто 'а нуу, 0.1 + 0.1 не равно 0.2 да и ладно, написано, значит написано'. Спасибо большое автору статьи! Сейчас скину пару изображений и перейдем к финалу
‼️Все что было описано выше 👆🏿 это процесс перевода вещественного числа в двоичное представление.
Опять же, это применимо с удачными числами, без десятичных дробей 0.1, 02, 0.3 - 0.9
Опять же, это применимо с удачными числами, без десятичных дробей 0.1, 02, 0.3 - 0.9
👨💻2
Теперь, разберемся наконец с этими вещественными числами.
Почему 0.1 + 0.1 не будет равно точно 0.2❓
⭕️Число 0.1 в двоичной системе счисления будет равно 0.00011001100... и так далее, это бесконечная периодическая дробь в двоичной системе. Также как числа 0.1, 0.2 вплоть до 0.9, кроме 0.5 (Дальше узнаете почему).
Так вот проблема в том, что у нас память ограничена 32 битами, а представление числа в двоичной системе счисления бесконечно‼️
⭕️Это возможно сделать только путем отсечения той части числа, которая не помещается в 32 бита. По итогу, это число обрезается и представляется приближённым значением, к примеру,
🔗Сумма этой темы будет равна примерно 0.2≈0.20000000000000001110...
Точно вещественные числа не могут быть представлены из за ограничения в памяти и проблем с представлением в двоичной системе счисления.В этом, собственно, суть, но мне было очень интересно это изучить.
🧑💻Хочу еще добавить, что, когда я кидал промт GPT,он аргументировал неточность вычислений еще тем, что вещественные числа не могут быть точно представлены в двоичной системе счисления, если они не могут быть выражены как конечная сумма степеней двойки. Че это ваще значит?
‼️Если возьмем 0.5, то все знают, что это 1/2, а если это одна вторая, то двойку можно представить как 2 в степени -1. Точно также мы можем выразить степени двойки у чисел 0.625, 0.75 и т.д Если что-то еще найду, обязательно добавлю, спасибо еще раз автору статьи и вам за внимание! #Алгоритмы #Вещественные_числа #Программирование Вещественные числа
Почему 0.1 + 0.1 не будет равно точно 0.2❓
⭕️Число 0.1 в двоичной системе счисления будет равно 0.00011001100... и так далее, это бесконечная периодическая дробь в двоичной системе. Также как числа 0.1, 0.2 вплоть до 0.9, кроме 0.5 (Дальше узнаете почему).
Так вот проблема в том, что у нас память ограничена 32 битами, а представление числа в двоичной системе счисления бесконечно‼️
⭕️Это возможно сделать только путем отсечения той части числа, которая не помещается в 32 бита. По итогу, это число обрезается и представляется приближённым значением, к примеру,
0.1+0.1=0.10000000000000000555...+0.10000000000000000555...
🔗Сумма этой темы будет равна примерно 0.2≈0.20000000000000001110...
Точно вещественные числа не могут быть представлены из за ограничения в памяти и проблем с представлением в двоичной системе счисления.В этом, собственно, суть, но мне было очень интересно это изучить.
🧑💻Хочу еще добавить, что, когда я кидал промт GPT,он аргументировал неточность вычислений еще тем, что вещественные числа не могут быть точно представлены в двоичной системе счисления, если они не могут быть выражены как конечная сумма степеней двойки. Че это ваще значит?
‼️Если возьмем 0.5, то все знают, что это 1/2, а если это одна вторая, то двойку можно представить как 2 в степени -1. Точно также мы можем выразить степени двойки у чисел 0.625, 0.75 и т.д Если что-то еще найду, обязательно добавлю, спасибо еще раз автору статьи и вам за внимание! #Алгоритмы #Вещественные_числа #Программирование Вещественные числа
Telegram
CodeLab
НАВИГАЦИЯ 🧑💻 ‼️ОБЯЗАТЕЛЬНО К ПРОЧТЕНИЮ‼️
https://stepik.org/course/58852/syllabus — КУРС, КОТОРЫЙ МЫ ПРОХОДИМ
🔗 Python: "Поколение Python": курс для начинающих.
🔗 Python: "Поколение Python": курс для начинающих (часть 2).
⚙️ Python (Базовые знания)…
https://stepik.org/course/58852/syllabus — КУРС, КОТОРЫЙ МЫ ПРОХОДИМ
🔗 Python: "Поколение Python": курс для начинающих.
🔗 Python: "Поколение Python": курс для начинающих (часть 2).
⚙️ Python (Базовые знания)…
👨💻2
‼️Хочу немного добавить к вышесказанному👆🏿
Итак, мантисса определяет точность числа. Это основная часть числа, содержащая значащие цифры.
Экспонента (или порядок) определяет величину числа, указывая, на сколько нужно сдвинуть запятую в мантиссе для получения полного числа. Вот вам число 2.997925 · 10^8 = 299 792 500, экспонента здесь 8, и я уже объяснил, почему (потому что 8 сдвигов было). Жирным выделена мантисса (2.997925), а курсивом экспонента (8). ‼️Число = Мантисса × 2 ** Экспонента ‼️- это формула представления числа с плавающей точкой, это мы с вами уже обсуждали.
Допустим, мы хотим умножить два числа с плавающей точкой: Мантиссы обоих чисел перемножаются, что даёт новую мантиссу - это первое, Порядки (экспоненты) складываются - это второе. Щас мем смешной скину и пойду спать, а у нас впереди тема массивов и связанных списков... #Мантисса
Итак, мантисса определяет точность числа. Это основная часть числа, содержащая значащие цифры.
Экспонента (или порядок) определяет величину числа, указывая, на сколько нужно сдвинуть запятую в мантиссе для получения полного числа. Вот вам число 2.997925 · 10^8 = 299 792 500, экспонента здесь 8, и я уже объяснил, почему (потому что 8 сдвигов было). Жирным выделена мантисса (2.997925), а курсивом экспонента (8). ‼️Число = Мантисса × 2 ** Экспонента ‼️- это формула представления числа с плавающей точкой, это мы с вами уже обсуждали.
Допустим, мы хотим умножить два числа с плавающей точкой: Мантиссы обоих чисел перемножаются, что даёт новую мантиссу - это первое, Порядки (экспоненты) складываются - это второе. Щас мем смешной скину и пойду спать, а у нас впереди тема массивов и связанных списков... #Мантисса
👨💻2
✅ Следующее задание #Дробная_часть, как раз тут нам поясняют проблему с числами типа float ,❗️ там чел оставил ссылку почитать, я вам ее прикреплю, но прям сильно другое там не написано, вчера я достаточно нормально все изъяснил.
Сейчас решим задачку и я вам расскажу как можно избежать проблем с расчетом таких чисел
‼️https://docs-python.ru/tutorial/operatsii-chislami-python/problemy-chisel-plavajuschej-zapjatoj/#float-error‼️
Сейчас решим задачку и я вам расскажу как можно избежать проблем с расчетом таких чисел
‼️https://docs-python.ru/tutorial/operatsii-chislami-python/problemy-chisel-plavajuschej-zapjatoj/#float-error‼️
👨💻2
CodeLab
👨💻 Иииитак, вчера я ничего не делал, щас буду рассказывать про хранение памяти в компьютере, как раз это свяжем с проблемой чисел с плавающей точкой, поэтому постарайтесь все внимательно прочитать‼️ ⭕️ Для хранения одной ячейки информации в памяти используется…
🧑💻Я вас, наверное, уже за❌бал с этими вещественными числами, но, мы не коснулись чисел формата ❗️двойной точности.
Я уже говорил, что это формат, с котором доступно 64 бита, на знак выделяется ‼️1 бит, экспоненту - 11 битов (для вещественных чисел двойной точности используется смещение на 1023, что означает, что экспонента от 0 до 2047 кодируется числами от -1023 до 1024, для чисел формата одинарной точности сдвиг всего на 127,но это так). На мантиссу приходится 52 бита.‼️
🔗Я вам уже объяснял, как вещественные числа преобразуются в двоичный код, можете почитать, я прикреплю. ⭕️Разница в том, что к мантиссе прибавляем не число 127, а число 1023. Если число 6.25, это 110.01, опять же происходит два сдвига, потому что по формуле у нас в целой части должна быть единица, поэтому получается число 1.1001 * 10 ** 2, экспонента тут - 2, к ней прибавляем сдвиг 1023 и получаем 1025. По итогу, 1 это знак, 10000000001 это экспонента, 1011000... это мантисса
UPD: Рекомендую читать с самого начала !
Я уже говорил, что это формат, с котором доступно 64 бита, на знак выделяется ‼️1 бит, экспоненту - 11 битов (для вещественных чисел двойной точности используется смещение на 1023, что означает, что экспонента от 0 до 2047 кодируется числами от -1023 до 1024, для чисел формата одинарной точности сдвиг всего на 127,но это так). На мантиссу приходится 52 бита.‼️
🔗Я вам уже объяснял, как вещественные числа преобразуются в двоичный код, можете почитать, я прикреплю. ⭕️Разница в том, что к мантиссе прибавляем не число 127, а число 1023. Если число 6.25, это 110.01, опять же происходит два сдвига, потому что по формуле у нас в целой части должна быть единица, поэтому получается число 1.1001 * 10 ** 2, экспонента тут - 2, к ней прибавляем сдвиг 1023 и получаем 1025. По итогу, 1 это знак, 10000000001 это экспонента, 1011000... это мантисса
UPD: Рекомендую читать с самого начала !
👨💻2
🔗Я бы хотел вам пояснить за модули, которые помогли бы решить неточность вычислений, но оставим это на момент, когда столкнемся конкретно с изучением библиотек, чтобы сейчас не пересказывать обширную тему в двух словах.
⭕️ Поэтому, расскажу вам просто функцию round(number, digits). ❗️Первый аргумент это дробное число, а во втором (digits) указываем количество чисел после запятой. Второй аргумент по умолчанию равен нулю❗️. #Библиотеки
🔗Код:
⭕️ Поэтому, расскажу вам просто функцию round(number, digits). ❗️Первый аргумент это дробное число, а во втором (digits) указываем количество чисел после запятой. Второй аргумент по умолчанию равен нулю❗️. #Библиотеки
🔗Код:
a = round(7.2157, 3)
print(a) #Вывод:7.216
👨💻1