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))
#Сортировка_трех. Подаются три числа, нам нужно вывести об большего к меньшему, давайте думать