From: Constantin Poddubny <const@const.krasnoyarsk.su>
Organization: The Sosnovoborsk Municipal Venture for Housing and
> Как в Паскале представляются типы real,double и проч. вещественные?
> Где порядок, а где мантисса если обращаться напрямую к этим
> переменным в ассемблерных вставках?
Вообще-то вещественные типы, приведенные ниже, являются стандартом
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-битовое значение, яв-
ляющееся дополнением до двух.
С наилучшими пожеланиями, Константин Поддубный.
|