Формат чисел с плавающей точкой

Вещественные типы, приведенные ниже, являются стандартом IEEE (кроме типа Real), так что с ними можно работать не только в Паскале, но и в любом другом языке, поддерживающим этот стандарт.

Ниже приведен отрывок из документации по TP 6.0, BP 7.0 для тех, кто ее не читает:

Типы с плавающей точкой

Типы значений с плавающей точкой Real, Single, Double, Extended и Comp (вещественный, с одинарной точностью, с двойной точностью, с повышенной точностью и сложный) хранятся в виде двоичного представления знака (+ или -), показателя степени и значащей части числа. Представляемое число имеет значение:

+/- значащая_часть Х 2^показатель_степени
где значащая часть числа представляет собой отдельный бит слева от двоичной десятичной точки (то есть 0 <= значащая часть <= 2).

В следующей далее схеме слева расположены старшие значащие биты, а справа - младшие значащие биты. Самое левое значение хранится в самых старших адресах. Например, для значения вещественного типа e сохраняется в первом байте, f - в следующих пяти байтах, а s - в старшем значащем бите последнего байта.

Вещественный тип

Шестибайтовое (48-битовое) вещественное число (Real) подразделяется на три поля:

                    1        39           8
                  +---+------..-------+--------+
                  | s |      f        |   e    |
                  +---+------..-------+--------+
                      msb          lsb msb   lsb

     Значение v числа определяется с помощью выражений:

     if 0 < e <= 255, then v = (-1)^s * 2^(e-129)*(l.f).
     if e = 0,        then v = 0.

Вещественный тип не может использоваться для хранения ненормализованных чисел, значений, не являющихся числом (NaN), а также бесконечно малых и бесконечно больших значений. Ненормализованное число при сохранении его в виде вещественного принимает нулевое значение, а не числа, бесконечно малые и бесконечно большие значения при попытке использовать для их записи формат вещественного числа приводят к ошибке переполнения.

Здесь и далее msb означает более значащий бит (старшие разряды), lsb - менее значащий (младшие разряды).

Тип числа с одинарной точностью

Четырехбайтовое (32-битовое) число типа Single подразделяется на три поля:

                   1    8           23
                 +---+------+-------..---------+
                 | s |  e   |        f         |
                 +---+------+-------..---------+
                     msb   lsb msb            lsb

     Значение v этого числа определяется с помощью выражений:

     if 0 < e < 255,      then v = (-1)^s * 2^(e-12) * (l.f).
     if e = 0 and f <> 0, then v = (-1)^s * 2^(126) * (o.f).
     if e = 0 and f = 0,  then v = (-1)^s * O.
     if e = 255 and f = 0, then v = (-1)^s * Inf.
     if e = 255 and f <> 0, then v = NaN.

Тип числа с двойной точностью

Восьмибайтовое (64-битовое) число типа Double подразделяется на три поля:

                 1    11          52
               +---+------+-------..--------+
               | s |  e   |        f        |
               +---+------+-------..--------+
                  msb  lsb msb             lsb

     Значение v этого числа определяется с помощью выражений:

     if 0 < e < 2047,   then v = (-1)^s * 2^(e-1023) * (l.f).
     if e = 0 and f <> 0, then v = (-1)^s * 2^(1022) * (o.f).
     if e = 0 and f = 0,  then v = (-1)^s * O.
     if e = 2047 and f = 0, then v = (-1)^s * Inf.
     if e = 2047 and f <> 0, then v = NaN.

Тип числа с повышенной точностью

Десятибайтовое (80-битовое) число типа Extended подразделяется на четыре поля:

                 1    15      1          63
               +---+--------+---+--------..-------+
               | s |  e     | i |        f        |
               +---+--------+---+--------..-------+
                   msb     lsb  msb              lsb

     Значение v этого числа определяется с помощью выражений:

     if 0 < e < 32767,  then v = (-1)^s * 2^(e-1023) * (l.f).
     if e = 32767 and f = 0, then v = (-1)^s * Inf.
     if e = 32767 and f <> 0, then v = NaN.

Сложный тип

Восьмибайтовое (64-битовое) число сложного типа (Comp) подразделяется на два поля:

                 1             63
               +---+-----------..--------------+
               | s |           d               |
               +---+-----------..--------------+
                   msb                        lsb

     Значение v этого числа определяется с помощью выражений:

     if s = 1 and d = 0, then v = NaN.

в противном случае v представляет собой 64-битовое значение, являющееся дополнением до двух.

Дата публикации: 03.12.1994