Вещественные типы, приведенные ниже, являются стандартом 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-битовое значение, являющееся дополнением до двух.