💻 Логарифмическая линейка есть у нас дома

Пожалуй, в любом курсе про какие-то компьютеризированные вычисления где-то в начале говорят о том что "🤓 вообще говоря 0.1 + 0.2 ≠ 0.3". Если попробовать это проверить в каких-нибудь более-менее распространённых современных языках программирования, то получится что:
0.1 + 0.2 = 0.30000000000000004
Вот эта четвёрка в конце намекает на то что там где-то затесались степени двойки и их комбинации. И действительно — компьютеры же вечно с ноликами и единичками возятся, вот и тут объясянется всё тем, что компьютер не может точно хранить десятичные дроби и он переводит их в двоичную систему.
А десятичная 0.1 в двоичной записи — это бесконечная дробь 0.0001100110011... (прям как в десятичной записи 1/3 = 0.333...). Компьютер обрезает её после 52 битов мантиссы и получает крошечную погрешность 🤏
Стандарт хранения чисел IEEE 754 хранит числа как: знак (1 бит) + порядок (11 бит) + мантисса (52 бита).
Получается что-то вроде научной записи: ±1.xxxxx × 2^n.
Поэтому вообще говоря "точно" хранят компьютеры только степени двойки: 0.5, 0.25, 0.125, етц
Программы везде где могут — от расчётов решения уравнений обтекания крыла до каких-нибудь финансовых систем — используют целые числа, иногда специально вводя коэффициенты перевода, чтобы потом когда всё досчитается вернуть в понятном/привычном виде пользователю. И действительные числа советуют не не сравнивать на равенство, только "больше-меньше с погрешностью" (ну типа надо не 0.1+0.2 с 0.3 сравнивать, а вычесть (0.1+0.2)-0.3 и уже результат сравнить с чем-нибудь типа 0.0001 — так мы можем быть уверены что до этих знаков результат совпадает) А когда очень хочется, можно и другие стандарты взять, только может быть порасточительнее. В большинстве случаев вся эта точность ни к чему (да и целые числа тоже не такое сильно ограничение для большинства задач)
Короче, я к тому что в этом смысле компьютеры считают как с логарифмической линейкой — очень быстро, но немного приблизительно 🫠