- •5. Модель программирования с плавающей точкой.
- •5.1. Форматы и типы данных
- •5.1.1. Типы действительных чисел
- •5.1.2. Формат регистра с плавающей точкой
- •5.1.3. Представление значений в регистрах с плавающей точкой
- •5.2. Регистр состояния с плавающей точкой
- •5.3. Инструкции с плавающей точкой
- •5.3.1. Инструкции доступа к памяти
- •5.3.2. Инструкции обмена между регистрами с плавающей точкой и основными регистрами
- •5.3.3. Арифметические инструкции
- •5.3.4. Неарифметические инструкции
- •5.3.5. Инструкции поля состояния для регистра состояния с плавающей точкой (fpsr)
- •5.3.6. Инструкции целочисленного умножения и сложения
- •5.4. Дополнительные обсуждения в связи с ieee
- •5.4.1. Прерывания с плавающей точкой
- •5.4.1.1. Ошибка: Недоступный регистр с плавающей точкой
- •5.4.1.2. Ошибка: Исключение с плавающей точкой
- •5.4.1.3. Ловушка «Исключение с плавающей точкой»
- •5.4.2. Определение Переполнения
- •5.4.3. Определение Крошечности, Неточности и Антипереполнения.
- •5.4.4. Целочисленные неверные операции
- •5.4.5. Определение целочисленных операций
- •5.4.6. Определение и распространение значений.
- •5.4.7. Операции, предписанные стандартом ieee, отложенные программно
- •5.4.8. Дополнения сверх стандарта ieee
5.1.3. Представление значений в регистрах с плавающей точкой
Коды в регистрах с плавающей точкой сгруппированные в классы и подклассы перечислены ниже, в табл. 5.2 (затененные коды не поддерживаются). Последние две строки таблицы содержат значения констант записанных в регистрах с плавающей точкой FR0 иFR1. Значение константы вFR1 не изменяется для параллельных инструкций с одинарной точностью или для инструкций целочисленного умножения с накоплением.
Табл.5.2. Коды в регистрах с плавающей точкой
Классы или подклассы |
Знак (1 бит) |
Смещенный порядок (17 бит) |
Мантисса i.bb…bb (64 бита) |
NaN(не числа) |
0/1 |
0x1FFFF |
от 1.000…01 до 1.111…11 |
Тихие (Quiet)NaN |
0/1 |
0x1FFFF |
от 1.100…00 до 1.111…11 |
Неопределенность - тихий NaNa |
1 |
0x1FFFF |
1.100…00 |
Сигнальные NaN |
0/1 |
0x1FFFF |
от 1.000…01 до 1.011…11 |
Бесконечность |
0/1 |
0x1FFFF |
1.000…00 |
Псевдо- NaN |
0/1 |
0x1FFFF |
от 0.000…01 до 0.111…11 |
Псевдо- неопределенность |
0/1 |
0x1FFFF |
0.000…00 |
Нормализованные числа (в нормализованном формате регистра с плавающей точкой) |
0/1 |
от 0x00001 до 0x1FFFE |
от 1.000…00 до 1.111…11 |
Целые, либо параллельные FP(большие без знака или отрицательные целые) |
0 |
0x1003E |
от 1.000…00 до 1.111…11 |
Целочисленная неопределенностьb |
0 |
0x1003E |
1.000…00 |
IEEEнормализованные вещественные числа с одинарной точностью |
0/1 |
от 0x0FF81 до 0x1007E |
от 1.000…00…(40)нулей до 1.111…11…(40)нулей |
IEEEнормализованные вещественные числа с двойной точностью |
0/1 |
от 0x0FC01 до 0x103FE |
от 1.000…00…(11) нулей до 1.111…11…(11) нулей |
IEEEнормализованные вещественные числа с двойной расширенный точностью |
0/1 |
от 0x0C001 до 0x13FFE |
от 1.000…00 до 1.111…11 |
Обычные числа с тем же значением, что и псевдо-денормализованные двойные расширенные вещественные числа |
0/1 |
от 0x0C001 |
от 1.000…00 до 1.111…11 |
Стековые нормализованные одинарные IA-32 (делается, когда модель вычисл-ий – это стекIA-32 с одинарной точностью) |
0/1 |
от 0x0C001 до 0x13FFE |
от 1.000…00…(40) нулей до 1.111…11…(40) нулей |
Стековые нормализованные двойные IA-32 (делается, когда модель вычислений – это стекIA-32 с двойной точностью) |
0/1 |
от 0x0C001 до 0x13FFE |
от 1.000…00…(11) нулей до 1.111…11…(11) нулей |
Не нормализованные числа (в формате регистра с плавающей точкой) |
0/1 |
0x00000 |
от 0.000…01 до 1.111…11 |
от 0x00001 до 0x1FFFE |
от 0.000…01 до 0.111…11 | ||
от 0x00001 до 0x1FFFD |
0.000…00 | ||
1 |
0x1FFFE |
0.000…00 | |
Целые (положительные знаковые или без знака) либо параллельные FP |
0 |
0x1003E |
от 0.000…00 до 0.111…11 |
IEEEденормализованные с одинарной точностью вещественные числа |
0/1 |
0x0FF81 |
от 0.000…01…(40)нулей до 0.111…11…(40)нулей |
IEEEденормализованные с двойной точностью вещественные числа |
0/1 |
0x0FC01 |
от 0.000…01…(11) нулей до 0.111…11…(11) нулей |
Денормализованный формат регистра |
0/1 |
0x00001 |
от 0.000…01 до 0.111…11 |
Не нормализованные числа с тем же значением, что и денормализованные двойные расширенные вещественные числа |
0/1 |
0x0C001 |
от 0.000…01 до 0.111…11 |
Денормализованные двойные расширенные вещественные числа |
0/1 |
0x00000 |
от 0.000…01 до 0.111…11 |
Стековые денормализованные одинарные IA-32 (делается, когда модель вычисл-ий – это стекIA-32 с одинарной точностью) |
0/1 |
0x00000 |
от 0.000…01…(40)нулей до 0.111…11…(40)нулей |
Стековые денормализованные двойные IA-32 (делается, когда модель вычисл-ий – это стекIA-32 с двойной точностью) |
0/1 |
0x00000 |
от 0.000…01…(11) нулей до 0.111…11…(11) нулей |
Псевдо-денормализованные двойные расширенные вещественные числа (формат IA-32 стека и памяти) |
0/1 |
0x00000 |
от 1.000…00 до 1.111…11 |
Псевдо нули |
0/1 |
от 0x00001 до 0x1FFFD |
0.000…00 |
1 |
0x1FFFE |
0.000…00 | |
NaTValc |
0 |
0x1FFFE |
0.000…00 |
Ноль |
0/1 |
0x00000 |
0.000…00 |
FR0 (положительный ноль) |
0 |
0x00000 |
0.000…00 |
FR1 (положительная единица) |
0 |
0x0FFFF |
1.000…00 |
a. Создается при маскировании ошибочной вещественной операции.
b. Создается при маскировании ошибочной целочисленной операции.
c. Создается при не успешной спекулятивной операции с памятью.
Все коды регистров могут быть использованы, как исходные значения арифметических операций. В большинстве случаев, значение, вычисленное в результате арифметической операции, представлено в нормализованном регистровом формате, где порядок находится в диапазоне от EmaxдоEminсоответствующих приемнику, а мантисса имеет значащие биты, соответствующие приемнику. Вычисленные значения типа нулей, бесконечностей и значенийNaN, которые выходят за эти границы, представлены соответствующими уникальными кодами формата регистра. Денормализованные двойные расширенные результаты отображаются в формате с порядком 0x00000 (вместо 0x0C001). Не поддерживаемые коды (псевдо-NaNи псевдо-бесконечности), псевдо-нули и псевдо- нормализованные двойного расширенного формата – никогда не получаются в результате арифметических операций.
В арифметических операциях псевдо-нули работают точно также как ноль со знаком, но есть одно исключение. Умножение псевдо-нуля на бесконечность возвращает корректное значение бесконечности со знаком, вместо вызова ошибки «Исключение недопустимой операции с плавающей точкой» (и возвращения QNaN). Кроме того, псевдо-нули относятся к классу ненормализованных чисел, а не к классу нулей.