CodeLab
145 subscribers
538 photos
20 videos
159 links
Говорим просто о сложном

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
⭕️ 8 битный диапазон, для нахождения экспоненты. Все отрицательные степени будут располагаться левее числа 127, а все положительные - правее.
🧑‍💻 Конечный результат
👨‍💻2
‼️Все что было описано выше 👆🏿 это процесс перевода вещественного числа в двоичное представление.

Опять же, это применимо с удачными числами, без десятичных дробей 0.1, 02, 0.3 - 0.9
👨‍💻2
👨‍💻2
Теперь, разберемся наконец с этими вещественными числами.

Почему 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 и т.д Если что-то еще найду, обязательно добавлю, спасибо еще раз автору статьи и вам за внимание! #Алгоритмы #Вещественные_числа #Программирование Вещественные числа
👨‍💻2
‼️Хочу немного добавить к вышесказанному👆🏿

Итак, мантисса определяет точность числа. Это основная часть числа, содержащая значащие цифры.

Экспонента
(или порядок) определяет величину числа, указывая, на сколько нужно сдвинуть запятую в мантиссе для получения полного числа. Вот вам число 2.997925 · 10^8 = 299 792 500, экспонента здесь 8, и я уже объяснил, почему (потому что 8 сдвигов было). Жирным выделена мантисса (2.997925), а курсивом экспонента (8). ‼️Число = Мантисса × 2 ** Экспонента ‼️- это формула представления числа с плавающей точкой, это мы с вами уже обсуждали.

Допустим, мы хотим умножить два числа с плавающей точкой: Мантиссы обоих чисел перемножаются, что даёт новую мантиссу - это первое, Порядки (экспоненты) складываются - это второе. Щас мем смешной скину и пойду спать, а у нас впереди тема массивов и связанных списков... #Мантисса
👨‍💻2
🤡3
Следующее задание #Дробная_часть, как раз тут нам поясняют проблему с числами типа float ,❗️ там чел оставил ссылку почитать, я вам ее прикреплю, но прям сильно другое там не написано, вчера я достаточно нормально все изъяснил.

Сейчас решим задачку и я вам расскажу как можно избежать проблем с расчетом таких чисел

‼️https://docs-python.ru/tutorial/operatsii-chislami-python/problemy-chisel-plavajuschej-zapjatoj/#float-error‼️
👨‍💻2
Самое простое решение, из вещественного числа вычесть целую часть числа, 44.45 - 45 = 0.45.

a = float(input())
print(a - int(a))
👨‍💻2
Второе решение, вещественное число делим по модулю на 1, получаем просто остаток, если бы делили целочисленным, то получили бы целую часть.

n = float(input())
print(n % 1)
👨‍💻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: Рекомендую читать с самого начала !
👨‍💻2
🔗Я бы хотел вам пояснить за модули, которые помогли бы решить неточность вычислений, но оставим это на момент, когда столкнемся конкретно с изучением библиотек, чтобы сейчас не пересказывать обширную тему в двух словах.

⭕️ Поэтому, расскажу вам просто функцию round(number, digits). ❗️Первый аргумент это дробное число, а во втором (digits) указываем количество чисел после запятой. Второй аргумент по умолчанию равен нулю❗️. #Библиотеки

🔗Код:

a = round(7.2157, 3)
print(a) #Вывод:7.216
👨‍💻1
Всем спокойной ночи 😴
#meme всем добре утро
CodeLab
Следующее задание #Дробная_часть, как раз тут нам поясняют проблему с числами типа float ,❗️ там чел оставил ссылку почитать, я вам ее прикреплю, но прям сильно другое там не написано, вчера я достаточно нормально все изъяснил. Сейчас решим задачку и я…
🔗Разберем еще одно решение с коментов.

0️⃣ Итак, для начала вводим строку (в нашем случае, допустим, 122.3676). Мы уже разбирали метод split(), он разбивает нашу строку, в нашем случае на 2 части, где разделителем будет точка " . ". Результатом на данном этапе будет ["122", "3676"].

1️⃣ Ну и видим, что в начале добавляется " 0. ", по итогу, получаем на выходе 0.3676.
⭕️ Кстати, дробную часть числа (3676) мы выбрали из за индекса [1], индексация у нас начинается с 0 как никак, поэтому выбираем 'вторую часть' разбитой строки. #split #float #Дробная_часть

🔗Код:

a = '0.' + input().split('.')[1]

print(float(a))
Итак, задание #Наибольшее_и_наименьшее, тут разберемся min() и max(). Аргументов у этих функций может быть любое количество, главное, чтобы они все поддерживали между собой операцию сравнения, типо мы не можем сравнивать строку с вещественным числом) Решение ниже 👇🏿
Функции min() и max() просто сравнивают считанные целые числа и код выводит наименьшее и наибольшее число. #Наибольшее_и_наименьшее

🔗Готовый код:

a = int(input())
b = int(input())
c = int(input())
d = int(input())
e = int(input())
print(str("Наименьшее число ="), min(a,b,c,d,e))
print(str("Наибольшее число ="), max(a,b,c,d,e))
#Сортировка_трех. Подаются три числа, нам нужно вывести об большего к меньшему, давайте думать
Итак, чтобы вывести максимальное и минимальное число проблем нет, мы уже изучили функции max() и min(). ‼️Чтобы вывести среднее, нам нужно сложить все три числа и вычесть максимальное и минимальное, как раз получаем среднее число. #Сортировка_трех #max #min

🔗Готовый код:

a, b, c = int(input()), int(input()), int(input())

print(max(a, b, c), a + b + c - min(a, b, c) - max(a, b, c), min(a, b, c), sep = '\n' )
🤡2