Форматы дробных чисел с плавающей запятой

Александр Бельченко
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.