Форматы данных: Форматы данных FPU

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

FPU содержит восемь 80-битных регистров общего назначения. Он может оперировать данными, которые могут размещаться в этих регистрах или памяти. Всего поддерживается семь различных форматов. Три формата для целых, три — для вещественных, один — для двоично-десятичных чисел. Каждый из этих форматов характеризуется числом занимаемых бит и диапазонами представимых в этом формате значений.

 

Таблица 4.1. Форматы данных FPU



Форматы данных

Число байт

Примерный диапазон значений

Целое слово

2

 -104...+104

Короткое целое

4

 -109…+109

Длинное целое

8

 -1018…+1018

Двоично-десятичное

10

 -1018…+1018

Короткое вещественное

4

 -1038…-10-38…10-38…1038

Длинное вещественное

8

 -10308…-10-308…10-308…10308

Временное вещественное

10

 -104932…-10-4932…10-4932…104932

 

Целые числа

Форматы целых чисел, поддерживаемых FPU: целое слово (word integer), короткое целое (short integer), длинное целое (long integer). Они занимают, соответственно, слово, двойное слово или два двойных слова. Самый старший бит слова, двойного слова или старшего двойного слова, занимаемого числом, отводится для индикации знака числа. Нуль соответствует плюсу, 1 — минусу. Таким образом, возможный диапазон представляемых значений для знаковых целых составляет: от –32768 до +32767 для слов, от –231 до 231-1 для коротких целых, от –263 до 263-1 для длинных целых.

Специальное значение — целочисленная неопределенность записывается как отрицательный нуль. Если данное значение используется в качестве операнда-источника в командах загрузки целого или в арифметических операциях с целыми, FPU воспринимает его как наибольшее отрицательное значение, представленное в соответствующем формате. FPU может возвращать целочисленную неопределенность в операнд-назначение в следующих двух случаях:

 

Таблица 4.2. Представление двоичных целых



Класс

Знак

Величина

Положительные

(Больше)

0

11 .. 11

 

...

...

(Меньше)

0

00 .. 01

Нуль

0

00 .. 00

Отрицательные

(Меньше)

1

11 .. 11

 

...

...

(Больше)

1

00 .. 01

Целочисленная неопределенность

1

00 .. 00

 

Слово:

15 бит

 

Короткое:

31 бит

 

Длинное:

63 бита

 

Двоично-десятичные целые числа

Двоично-десятичные целые (decimal integer) — это набор четырехбитовых беззнаковых величин, каждая из которых может принимать значения от 0 до 9 и поле знака. В этом формате каждая цифра десятичного числа представляется четырьмя битами (тетрада), старшие тетрады соответствуют более старшим значащим цифрам десятичного числа. Старший бит старшего байта 80-битного двоично-десятичного значения предназначен для индикации знака числа, остальные же биты этого байта не используются и должны быть нулевыми.

Специальное значение — упакованная десятичная неопределенность возвращается командой FBSTP как реакция на замаскированное исключение "недействительная операция". Попытка загрузить это значение командой FBLD приведет к неопределенному результату.

 

Таблица 4.3. Представление двоично-десятичных



Класс

Знак

 

Величина

digit

digit

digit

digit

...

digit

Положительные

(Больше)

0

0

1001

1001

1001

1001

...

1001

 

...

...

...

...

...

...

...

...

(Меньше)

0

0

0

0

0

0

...

1

Нуль

0

0

0

0

0

0

...

0

Отрицательные

(Меньше)

1

0

0

0

0

0

...

0

 

...

...

...

...

...

...

...

...

(Больше)

1

0

1001

1001

1001

1001

...

1001

Неопреде-ленность

1

1111111

1111

1111

xxxx

xxxx

...

xxxx

 

1 байт

9 байт

 

Вещественные числа

FPU поддерживает три формата для вещественных чисел: короткие вещественные (short-real или single-real), длинные вещественные (long-real или double-real) и временные вещественные (temp-real или extended-real).

Все вещественные форматы могут быть использованы для кодирования самых разнообразных значений. В общем случае, эти значения могут быть разделены на следующие классы:

  • нули со знаком;
  • нормализованные вещественные числа;
  • денормализованные вещественные числа;
  • бесконечности со знаком;
  • "не числа" (NaN);
  • неопределенности.

Существуют также некорректные кодировки, которые не интерпретируются FPU и не должны использоваться.

В общем случае вещественные числа кодируются с помощью трех полей: знак, порядок и мантисса.

Для индикации знака отводится один самый старший бит числа, 1 соответствует отрицательным числам, 0 — положительным. В следующих (более младших) битах располагается поле порядка, оно занимает 8, 11 или 15 бит в зависимости от формата.

Для поля порядка не предусмотрено отдельного бита знака, здесь применяется т.н. смещение порядка, оно заключается в прибавлении к реальному значению порядка некоторой константы и последующему кодированию уже этой суммы. Таким образом, все кодируемые значения положительны. С учетом применяемых в различных форматах констант (127 для коротких вещественных, 1023 для длинных вещественных, 16383 для временных вещественных) в поле порядка могут кодироваться следующие значения для порядка: от –126 до 127 для коротких вещественных, от –1022 до 1023 для длинных вещественных, от –16382 до 16383 для временных вещественных.

Поле мантиссы занимает самые младшие биты. Его интерпретация зависит от применяемого формата. Для коротких и длинных вещественных самый старший бит мантиссы подразумевается равным единице для нормализованных величин и опускается. Таким образом, в форматах коротких и длинных вещественных поле мантиссы содержит только дробную часть числа. Старший бит считается нулевым при кодировании очень малых денормализованных чисел (когда смещенный порядок равен нулю) и нуля. В формате временных-вещественных старший бит мантиссы соответствует целой части мантиссы и не подразумевается автоматически равным чему-либо, все последующие младшие биты соответствуют дробной части мантиссы.

Специальное значение — вещественная неопределенность является частным случаем отрицательных "не чисел" (QNaN). Она кодируется значением 10…00 для коротких и длинных вещественных и 110…00 для временных вещественных в поле мантиссы. Вещественная неопределенность может возвращаться FPU как замаскированная реакция на исключение "недействительная операция".

 

Таблица 4.4. Представление коротких (short-real) и длинных (long-real) вещественных



Класс

Знак

Порядок

Мантисса

Положительные "не числа" (NaN)

Quiet NaN (QNaN)

0

11 .. 11

11 .. 11

...

...

...

0

11 .. 11

10 .. 00

Signaling NaN (SNaN)

0

11 .. 11

01 .. 11

...

...

...

0

11 .. 11

00 .. 01

Положительные вещественные

Бесконечность (+INF)

0

11 .. 11

00 .. 00

Нормализованные

0

11 .. 10

11 .. 11

...

...

...

0

00 .. 01

00 .. 00

Денормализованные

0

00 .. 00

11 .. 11

...

...

...

0

00 .. 00

00 .. 01

Нуль

0

00 .. 00

00 .. 00

Отрицательные вещественные

Нуль

1

00 .. 00

00 .. 00

Денормализованные

1

00 .. 00

00 .. 01

...

...

...

1

00 .. 00

11 .. 11

Нормализованные

1

00 .. 01

00 .. 00

...

...

....

1

11 .. 10

11 .. 11

Бесконечность (-INF)

1

11 .. 11

00 .. 00

Отрицательные "не числа" (NaN)

Signaling (SNaN)

1

11 .. 11

00 .. 01

...

...

...

1

11 .. 11

01 .. 11

Quiet NaN (QNaN)

1

1 .. 11

10 .. 00

...

...

...

1

11 .. 11

11 .. 11

 

Короткое:

8 бит

23 бита

 

Длинное:

11 бит

52 бита

 

Таблица 4.5. Представление временных вещественных (temp-real)



Класс

Знак

Порядок

Мантисса

Положительные "не числа" (NaN)

Quiet NaN (QNaN)

0

11 .. 11

111 .. 11

...

...

...

0

11 .. 11

110 .. 00

Signaling NaN (SNaN)

0

11 .. 11

101 .. 11

...

...

...

0

11 .. 11

100 .. 01

Положительные вещественные

Бесконечность (+INF)

0

11 .. 11

100 .. 00

Нормализованные

0

11 .. 10

111 .. 11

...

...

...

0

00 .. 01

100 .. 00

Ненормализованные

0

00 .. 00

111 .. 11

...

...

...

0

00 .. 00

100 .. 01

Денормализованные

0

00 .. 00

011 .. 11

...

...

...

0

00 .. 00

000 .. 01

Нуль

0

00 .. 00

000 .. 00

Отрицательные вещественные

Нуль

1

00 .. 00

000 .. 00

Денормализованные

1

00 .. 00

000 .. 01

...

...

...

1

00 .. 00

011 .. 11

Ненормализованные

1

00 .. 00

100 .. 00

...

...

...

1

00 .. 00

111 .. 11

Нормализованные

1

00 .. 01

100 .. 00

...

...

...

1

11 .. 10

111 .. 11

Бесконечность (-INF)

1

11 .. 11

100 .. 00

Отрицательные "не числа" (NaN)

Signaling NaN (SNaN)

1

11 .. 11

100 .. 01

...

...

...

1

11 .. 11

101 .. 11

Quiet NaN (QNaN)

1

1 .. 11

110 .. 00

...

...

...

1

11 .. 11

111 .. 11

 

15 бит

64 бита

 

Неподдерживаемые форматы

Сопроцессоры 8087 и Intel287 поддерживали ряд специальных форматов данных, которые были удалены из последующих сопроцессоров для полного соответствия стандарту IEEE-754.

 

Таблица 4.6. Неподдерживаемые форматы Intel387, Intel486, …



Класс

Знак

Порядок

Мантисса

Положительные псевдо "не числа" (Pseudo-Nan)

Quiet

0

11 .. 11

011 .. 11

...

...

...

0

11 .. 11

010 .. 00

Signaling

0

11 .. 11

001 .. 11

...

...

...

0

11 .. 11

000 .. 01

Псевдо-бесконечность

0

11 .. 11

100 .. 00

Положительные вещественные

Ненормализованные

0

11 .. 10

011 .. 11

...

...

...

0

00 .. 01

000 .. 00

Отрицательные вещественные

Ненормализованные

1

00 .. 01

000 .. 00

...

...

...

1

11 .. 10

011 .. 01

Псевдо-бесконечность

1

11 .. 11

100 .. 00

Отрицательные псевдо "не числа" (Pseudo-NaN)

Signaling

1

11 .. 11

000 .. 01

...

...

...

1

11 .. 11

001 .. 11

Quiet

1

11 .. 11

010 .. 00

...

...

...

1

11 .. 11

011 .. 11

 

15 бит

64 бита