Из описанных правил есть исключения. Так, если все биты экспоненты равны нулю (т. е. там стоит число -127), то к мантиссе перед ее началом надо добавлять не "1.", а "0." Single
было бы равно примерно 5,9·10-39. А так появляется возможность использовать числа до 1,4·10-45. Побочным эффектом этого является то, что числа, меньшие чем 1,17·10-38, представляются с меньшей, чем 24 двоичных разряда, точностью. Если все биты в экспоненте равны единице, а в мантиссе — нулю, то мы получаем комбинацию, известную как INF
(от англ. NAN
(Not A Number — не число). Попытки работы с комбинациями NAN
или INF
приводят к ошибке времени выполнения.
Для задания нуля все биты мантиссы и экспоненты должны быть равны нулю (формально это означает 0·10-127). С учетом описанных правил, если хотя бы один бит экспоненты не будет равен нулю (т. е. экспонента будет больше -127), запись будет считаться нормализованной, и нулевая мантисса будет рассматриваться как единица. Поэтому никакие другие комбинации значений мантиссы и экспоненты не могут дать ноль.
Тип Double
устроен точно так же, разница только в количестве разрядов и в том, какое значение экспоненты берется за ноль. Итак, мы имеем 11 разрядов для экспоненты. За ноль берется значение 1023.
Несколько иначе устроен Extended
. Кроме количественных отличий добавляется еще и одно качественное: в мантиссе явно указывается первый разряд. Это означает, что мантисса 1010… интерпретируется как 1.01, а не как 1.101, как это было в типах Single
и Float
. Поэтому если 23-битная мантисса типа Single
обеспечивает 24-знаковую точность, а 52-битная мантисса Double
— 53-битную, то 64-битная мантисса Extended
обеспечивает 64-х, а не 65-битную точность. Соответственно, при денормализованной форме записи первый разряд мантиссы явно содержит 0. За ноль экспоненты принимается значение 16 383.
Тип Real
, как уже упоминалось, стоит особняком. Во-первых, в нем биты следуют в другом порядке, а во-вторых, нет денормализованной формы. Мы не будем касаться внутреннего устройства типа Real
, т. к. эта информация уже перестала быть актуальной.
3.2.4. "Неполноценный"
Ранее мы отметили, что FPU всегда выполняет все операции в формате Extended
, оговорившись при этом, что есть исключение из этого правила. Здесь мы рассмотрим это исключение.
У FPU существует специальный двухбайтный регистр, называемый
Если восьмой бит содержит единицу (так установлено по умолчанию), то десять байтов внутренних регистров сопроцессора будут задействованы полностью, и мы получим "полноценный" Extended
. Если же этот бит равен нулю, то все определяется значением бита 9. Если он равен единице, то используется только 53 разряда мантиссы (остальные всегда равны нулю). Если же этот бит равен нулю — только 24 разряда мантиссы. Это увеличивает скорость вычислений, но уменьшает точность. Другими словами, точность работы сопроцессора может быть понижена до типа Double
или даже Single
. Но это касается только мантиссы, экспонента в любом случае будет содержать 15 бит, так что диапазон типа Extended
сохраняется в любом случае.
Для работы с управляющим словом сопроцессора в модуле System
описана переменная Default8087CW
типа Word
и процедура Set8087CW(CW: Word)
. При запуске программы в переменную Default8087CW
записывается
то управляющее слово, которое установила система при запуске программы. Функция Set8087CW
одновременно записывает новое значение в управляющее слово и в переменную Default8087CW
.