си база 3
float
цель: хранить десятичные дробные числа в двоичной системе проблема: двоичная система может хранить дроби в конечном виде только если эта дробь представляет половину или четверть
0.25 в двоичной системе будет 0.01 а вот 0.24 уже выйдет бесконечной дробью 0.00111101... да мы можем взять первые 8 бит и записать их в память, но возвращать число к десятичному виду из эти первых 8 бит будет крайне затруднительно. для 0.24 может быть и не так больно, но для чисел побольше начнутся проблемы.
для этих целей и придумали float
я загадал число 48.487. представьте что мы находимся на отрезке от -3.410^38 до 3.410^38 (диапазон float). на этом отрезке мы можем найти любое дробное число за 32 бита
для начала разобьем этот отрезок на самые крупные части которые мы можем. в двоичной системе эти куски будут степенями двойки: 0—16—32—48.487—64—...3.410^38 здесь мы видим что искомое число* находится между 2^5 (32) и 2^6 (64). нижняя граница то есть 2^5 называется экспонентой и кодируется как 5 = x - 127, то есть чтобы получить 32 нам нужно закодировать число 132. -127 присутствует в этой формуле потому что мы кодируем эту часть 8 битами, а имея 8 бит можно закодировать число 255. а двойка в 255 степени хоть и знатно расширяет диапазон возможных значений но на практике таких больших чисел никто не использует, поэтому чтобы сохранить баланс между диапазоном и точностью в формулу добавили нормализацию -127
теперь мы фокусируемся на отрезке 32—64 и уточняем искомое число дальше, делаем мы это оставшиеся 23 бита (1 бит знак, 8 бит экспонента) эта часть называется мантисса. по факту мантисса отвечает на вопрос на сколько мы должны домножить степень двойки она же экспонента чтобы получить искомое число. и с мантиссой логика примерно похожая.
32—48—64 48.487 > 48 поэтому закрашиваем 1 бит мантиссы и идем выше
48—56—64 48.487 < 56 не закрашиваем 2 бит мантиссы идем вниз
48—52—56 48.487 < 52 не закрашиваем 3 бит мантиссы идем вниз
так мы спускаемся до 23 раз уточняя дробную часть. чтобы выразить 48.487 мантисса должна дойти до числа 1 + 0.5152187347412109 и умножиться на экспоненту. то есть в итоге мы получаем 32 * 1,5152187347 = 48,4869995104
итоговая запись 48.487 в float равняется 0(знак) 10000100(132_2) 10000011111001010110000(мантисса)
[184]