Следующий ответ с небольшим количеством теории.
Объяснение ниже не объясняет стандарт IEEE с плавающей запятой, только общие идеи относительно представления чисел с плавающей запятой
Каждое число с плавающей точкой представлено дробной частью, умноженной на показатель степени, умноженный на знак. Кроме того, существует так называемое смещение для показателя степени, которое будет объяснено ниже.
Итак, мы имеем
- Знаковый бит
- Цифры дробной части
- цифры экспонентной части
Пример для базы 2 с 8-битной дробью и 8-битным показателем
Биты в дробной части сообщают нам, какие слагаемые (числа, которые нужно добавить) из последовательности ниже должны быть включены в представленное значение числа
2 ^ -1 + 2 ^ -2 + 2 ^ -3 + 2 ^ -4 + 2 ^ -5 + 2 ^ -6 + 2 ^ -7 + 2 ^ -8
Итак, если вы скажете 01101101 в дробной части, это даст
0 * 2 ^ -1 + 1 * 2 ^ -2 + 1 * 2 ^ -3 + 0 * 2 ^ -4 + 1 * 2 ^ -5 + 1 * 2 ^ -6 + 0 * 2 ^ - 7 + 1 * 2 ^ -8 = 0,42578125
Теперь ненулевые числа, которые представляются таким образом, попадают между
2 ** -8 = 0,00390625 и 1 - 2 ** - 8 = 0,99609375
Здесь начинается экспоненциальная часть. Экспонента позволяет нам представлять очень большие числа, умножая дробную часть на экспоненту. Поэтому, если у нас есть 8-битный показатель, мы можем умножить полученную дробь на числа между 0 и 2 ^ 255.
Итак, возвращаясь к примеру выше, возьмем показатель степени 11000011 = 195.
У нас есть дробная часть 01101101 = 0,42578125 и экспонента 11000011 = 195. Это дает нам число 0,42578125 * 2 ^ 195, это действительно большое число.
Пока что мы можем представлять ненулевые числа между 2 ^ -8 * 2 ^ 0 и (1-2 ^ -8) * 2 ^ 255. Это учитывает очень большие числа, но не очень маленькие числа. Чтобы иметь возможность представлять малые числа, мы должны включить в наш показатель степени так называемое смещение. Это число, которое всегда будет вычитаться из показателя степени, чтобы можно было представить маленькие числа.
Давайте возьмем смещение 127. Теперь все показатели вычтены 127. Значения, которые могут быть представлены, находятся между 2 ^ -8 * 2 ^ (0 - 127) и (1-2 ^ -8) * 2 ^ ( 255 - 127 = 128)
Номер примера теперь составляет 0,42578125 * 2 ^ (195-127 = 68), что все еще довольно велико.
Пример заканчивается
Чтобы понять это лучше, попробуйте поэкспериментировать с различными основаниями и размерами для дробной и экспоненциальной части. В начале не пытайтесь использовать нечетные основы, потому что это только усложняет необходимые вещи.
Как только вы поймете, как работает это представление, вы сможете написать код для получения представления любого числа в любой базовой, дробной / экспоненциальной комбинации частей.