Skip to content

24. Математический сопроцессор. Типы данных.

Natasha Gurova edited this page Jun 24, 2022 · 8 revisions

Отдельное опциональное устройство на материнской плате для расширения командного множества центрального процессора и обеспечивающий его функциональностью модуля операций с плавающей запятой, для процессоров, не имеющих интегрированного модуля.

История

Математический сопроцессор изначально шел в качестве отдельной микросхемы. Позже, в конце 80-ых и начале 90-ых, с 80496DX его интегрировали на одну плату с основным процессором.

Дальше стали появляться дополнительные расширения процессоров (которые могут в процессоре либо быть, либо не быть). В разных процессорах расширения могут быть реализованы по-разному.

Типы данных

Математический сопроцессор умеет манипулировать различными типами данных.

Ему доступно:

  • Три целых типа:

    • Целое слово (16 бит)
    • Короткое целое (32 бита)
    • Длинное слово (64 бита)
  • Отдельный тип, упакованный в 10ый:

    • Упакованное десятичное (80 бит)
  • Три вещественных типа:

    • Короткое вещественное (32 бита)
    • Длинное вещественное (64 бита)
    • Расширенное вещественное (80 бит)

Форма представления чисел с плавающей запятой в FPU

Основная задача математического сопроцессора - обработка уже не целых чисел, а чисел более сложного формата, дробей. Дроби представляются в компьютере в наиболее общем виде - в виде чисел с плавающей запятой. Число с плавающей запятой состоит из мантиссы (значащих чисел) и из экспоненты (степени, на которую мантисса умножается).

Особенности при представлении вещественных чисел в сопроцессорах 8087 и дальше такие, что экспонента хранится в беззнаковом виде, то есть она увеличена на определенную константу в зависимости от типа числа (чтобы экспонента всегда была положительной). Это позволяет легко и складывать, и сравнивать экспоненты без каких-то диапазонных разрывов.

Нормализованная форма преставления числа - это такая форма представления числа, когда оно представлено в виде между единицей и двумя. То есть когда мы число перевели в дробную форму и домножили его на степень двойки так чтобы запятая располагалась после самого первого двоичного разряда. (с) Кузнецов

Пример

0.5 + 0.125 = 0.101b

Для нормализации сдвигаем запятую вправо и запоминаем, что экспонента должна быть равна -1.
0.101b = 1.01b * 2^(-1)

В 32-х разрядном формате (формате короткого вещественного числа) получаем

0 01111110 01000000000000000000000

1. Старший бит - знак числа (знак мантиссы)
2. 8 бит - экспонента. В данном примере она увеличивается на 127 (те получаем 127 - 1 = 126)
3. 23 бита - мантисса, записанная без первой единицы 
   (число в нормализованном виде всегда начинается с 1 
   => 1 можно не писать и дополнительно повычить емкость мантиссы на 1 разряд.

Все вычисления FPU выполняются в расширенном 80-битном формате. То есть, для вычисления, все числа, независимо от текущего формата числа, переводятся в 80-разрядный.

Особые числа FPU

Сопроцессор поддерживает несколько так называемых особых значений чисел:

  • Положительная бесконечность: знаковый - 0, мантисса - нули, экспонента - единицы.

  • Отрицательная бесконечность: знаковый - 1, мантисса - нули, экспонента - единицы

  • NaN (Not a Number)

    • Тихое значение qNan - не приводит к исключению, может возникать при приведении типов/отдельных сравнениях, когда как таковой арифметической ошибки нет, но в результате число получить невозможно.

    • Сигнальный тип sNan - приводит к исключению, может возникать при переполнении в большую/меньшую сторону (при делении на ноль) и прочих ошибочных ситуациях.

  • Денормализованные числа - такие, которые не укладываются в заданный формат представления числа (в заданный тип данных из трёх доступных вещественных форматов сопроцессора) и позволяют хранить еще меньшие числа. Для этого в экспоненту заносятся нули, а мантисса считается умноженной на 2 в отрицательной степени, которая еще меньше чем минимальное значение экспоненты.

То есть они автомати аппаратно при обработке чисел ... ааа чет тут кузнецов сказал? Их обработка может производиться дольше чем обработка нормализованных чисел. Они нужны для повышения точности чтобы не потерять значения вблизи нуля

Бесконечное значение возникает при делении бесконечности на ноль.

Clone this wiki locally