Форматы дробных чисел с плавающей запятой
Александр Бельченко
25 сентября 2004
Для выполнения сложных расчетов с дробными числами в программах зачастую используются числа, представленные в экспоненциальном виде (в формате с плавающей запятой). Для микроконтроллеров наиболее распространненым является формат float 32х битных дробных чисел, также называемых числами одинарной точности.
В этом формате 1 бит отводится на хранение знака числа, 8 бит на хранение экспоненты числа и 23 бита на хранение дробной части числа.
Классы чисел с плавающей запятой
Все возможные вариации записи чисел с плавающей запятой разделены на ряд классов.
- Нулевые значения
- Нормализованные числа
- Денормализованные числа
- Бесконечности
- NaN (Not A Number не число)
Числа в виде NaN используются для представления исключительных случаев, таких как значение квадратного корня из отрицательного числа.
Каждый класс определяется тем, какие значения имеют экспонента и дробная часть.
Класс Экспонента Дробная часть
Нуль 0 0
Денормализованные числа 0 не ноль
Нормализованные числа 1-254 любые значения
Бесконечность 255 0
NaN (не число) 255 не ноль
Наиболее распространены нормализованные числа. Нормализованные дробные числа записываются в следующей форме:
(-1)s · m · 2e
Здесь:
s знак числа (0 число положительное, 1 отрицательное);
m мантисса (1 <= m < 2);
e экспонента.
В числе хранится дробная часть мантиссы Fract, т.е. мантисса
m = 1,Fract
В числе хранится значение экспоненты Exp, смещенное на 127, т.е.
e = Exp - 127
Денормализованные числа записываются в аналогичной форме, только у них всегда экспонета e равна -126 и мантисса m равна 0,Fract.
Примечание: –126 это наименьшее возможное значение экспоненты для нормализованных чисел.
Числа в нормализированном виде могут представлять значения из диапазона абсолютных значений от
1 · 10−38 до 1 · 1038.
Числа в денормализированном виде могут представлять значения из диапазона абсолютных значений от
1 · 10−45 до 1 · 10−38.
Из приведенной выше записи чисел следует, что имеется два нуля +0 (когда s=0) и
−0 (когда s=1), а также две бесконечности
+∞ (когда s=0) и −∞ (когда s=1).
Двоичные форматы чисел с плавающей запятой одинарной точности
Существует стандартная форма записи таких чисел, описанная стандартом IEEE 754, а также форма записи, предложенная фирмой Microchip, которая ориентирована на эффективное применение в 8-битных микроконтроллерах.
В 32х битном числе биты нумеруются с нуля от младших к старшим. Самый младший бит имеет номер 0, самый старший номер 31.
Стандартный формат IEEE 754
- В формате IEEE 754 для хранения знака числа используется бит 31.
- Для хранения значения смещенной экспоненты Exp используются биты 30...23.
- Для хранения дробной части Fract используются биты 22...0.
В формате IEEE 754 знак числа хранится в самом старшем бите, аналогично целым числам.
Формат, предложенный Microchip
Для удобства работы с числами с плавающей запятой в 8-битных микроконтроллерах фирма Microchip предложила свою версию формата. Отличия заключаются в том, что экспонента занимает целиком один байт.
- Для хранения экспоненты Exp используются биты 31...24.
- Для хранения знака числа используется бит 23.
- Для хранения дробной части Fract используются биты 22...0.
Поскольку при арифметических операциях с числами с плавающей запятой экспонента обрабатывается отдельно (и по другим правилам) от мантисы, то более удобным является хранение экспоненты в отдельном байте. Это позволяет в 8-битных микроконтроллерах сэкономить на операции сдвига при выделении экспоненты из числа.
Утилита FPConvert
Влад Князев написал утилиту FPConvert, которая преобразует число из привычной нам с вами формы записи в последовательность байт, которыми оно представляется в двоичном виде в формате float.
Утилита отображает байты в шестнадцатеричном виде для двух описанных форматов: IEEE 754 и формат а-ля Microchip.
Утилита FPConvert
Использованные источники
- Application Note AN575 «IEEE 754 Compliant Floating Point Routines», Microchip.com.