В сопроцессоре аппаратно реализуется выполнение операций с плавающей запятой, при его наличии в ПЭВМ можно значительно увеличить скорость вычислений и повысить их точность. Для использования сопроцессора программа в самом начале должна иметь директиву компилятора {$N+}:
Сопроцессор предоставляет возможность использовать дополнительные типы вещественных данных. Полный список вещественных типов:
Введем следующие обозначения для составных частей вещественных типов данных:
s - знак числа;
u - мантисса;
r - характеристика.
Тогда машинное представление вещественных типов имеет вид:
а) Тип single.
s r u
Здесь 1,8,23 - количество бит, отводимых соответственно для знака, характеристики и мантиссы числа.
б) Тип real.
s u r
в) Тип double.
s r u
г) Тип extended.
s r u
д) Тип comp.
s u
Тип comp - это фактически длинное целое число, но в программе оно рассматривается как вещественное число с нулевым порядком и мантиссой, в которой записывается только целая часть числа. Обычно тип comp используется в бухгалтерских расчетах.
Тип real по структуре отличается от типов single, double, extended: в real мантисса находится перед характеристикой, в остальных типах - после характеристики.
Непосредственно в сопроцессоре операции выполняются только для типа extended. Остальные вещественные типы при обращении к сопроцессору преобразуются в тип extended, при получении результата от сопроцессора производится обратное преобразование. Преобразования для типов single и double выполняются просто, так как последовательность составных частей числа здесь одинакова. Для типа real необходимо переставить местами мантиссу и характеристику, что требует дополнительного машинного времени.
Турбо Паскаль позволяет работать также в режиме эмуляции сопроцессора. В этом случае операции над вещественными числами при отсутствии сопроцессора выполняются программным путем.
Для включения режима эмуляции перед заголовком основной программы нужно поставить директиву компилятора {$E+}.
Директива {$N+, E+} означает, что программа работает с сопроцессором, если он имеется, и в режиме эмуляции при его отсутствии. Наличие в машине сопроцессора определяется автоматически.
Следует отметить, что тип real оптимизирован для работы без сопроцессора. При наличии сопроцессора дополнительное машинное время, затрачиваемое на перестановку мантиссы и порядка числа, сводит на нет преимущества сопроцессора; при этом время выполнения операций для типа real может в 2-3 раза превышать время выполнения операций для других вещественных типов. Поэтому при использовании сопроцессора, а современные компьютеры практически всегда обеспечивают аппаратную обработку чисел с плавающей запятой, рекомендуется применять лишь типы single, double, extended .
Если в разработанной программе везде объявлен тип real, то для перехода, например, к типу double достаточно в начале программы установить глобальное объявление
Type real = double .
Сопроцессор содержит внутренний стек вычислений, имеющий максимальную глубину восемь уровней. Доступ к переменной, находящейся в стеке сопроцессора, осуществляется значительно быстрее, чем доступ к переменной, находящейся в оперативной памяти. Поэтому для достижения максимальной производительности стек сопроцессора используется для хранения промежуточных результатов вычислений и для передачи параметров процедурам и функциям.
Если для вычисления в сопроцессоре длинного выражения требуется запомнить свыше восьми промежуточных результатов, то возникает переполнение его стека. Такая же ситуация имеет место, когда при обращении к процедуре или функции требуется передать свыше восьми параметров-значений (без слова Var) типов single, double, extended или comp. При переполнении стека сопроцессора сообщение об ошибке не генерируется, но результат вычислений будет неправильным. Для исключения такой ситуации длинные арифметические выражения следует разделить на части, а в заголовках соответствующих процедур или функций часть параметров-значений преобразовать в параметры-переменные или параметры-константы, добавив к ним соответственно слово Varили слово Const.