Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 119

...

Здесь 1.0Е-15 — точность для типа переменной d (Double).

Продолжим перечень особенностей применения сопроцессора. Его наличие в ПЭВМ и использование сильно влияет на работу функции округления Round: она начинает округлять полуторные значения в сторону ближайшего четного целого числа (это называется «банковским способом»)! Например:

без сопроцессора с сопроцессором

Round(0.5) --> 1 Round(0.5) --> 0

Round(1.5) --> 2 Round(1.5) --> 2

Round(2.5) --> 3 Round(2.5) --> 2

Round(3.5) --> 4 Round(3.5) --> 4

С остальными значениями (без '.5') функция работает нормально.

Некоторые неприятности могут поджидать любителей рекурсивного подхода к написанию функции. Возможны, в принципе, ситуации, когда рекурсивные вызовы переполнят внутренний стек данных сопроцессора, рассчитанный на восемь уровней рекурсии, и возникнет сбой программы. Возможным решением будет разнесение сложнорекурсивных выражений типа Fn:=Fn(N-1)+Fn(N-2) по локальным переменным, например, f1:=Fn(N-1); и f2:=Fn(N-2). После этого выражение Fn:=f1+f2 будет безопасным для сопроцессора.

Завершая тему использования сопроцессора, напомним, что и расширенные вещественные типы, и тип Real при работе с сопроцессором 80X87 выводятся на печать операторами Write и WriteLn с 4 цифрами в показателе степени:

при $N- WriteLn(123.4) выдаст 1.2340000000Е+02,

но при $N+ WriteLn(123.4) выдаст 1.234000000000000Е+0002.

Этот факт надо учитывать при форматированном выводе и при преобразовании чисел в строку процедурой Str.

- 186 -

Глава 10. Код программы, данные, адреса


Системная библиотека Турбо Паскаля содержит набор средств для анализа расположения программ и данных в памяти ПЭВМ. Широко поддерживается работа с адресами данных и кодов. В этой главе дается обзор этих средств и способы их применения.

10.1. Система адресации MS-DOS

Адресуемое пространство памяти в операционной системе MS-DOS организовано сегментами: последовательными блоками памяти по 64K каждый. Если известен сегмент, то дальнейшее уточнение места объекта в памяти происходит по его смещению, т.е. номеру байта от начала сегмента. Это, может быть, не самый эффективный способ адресации памяти, но на нем основана операционная система MS-DOS и все программы для нее. Таким образом, любая ячейка адресуемого пространства MS-DOS определяется парой чисел СЕГМЕНТ:СМЕЩЕНИЕ. При этом сегмент может начинаться с любого физического адреса, что порождает множественность способов адресации ячейки памяти. Например, такие разные адреса, как $83FD:$000B, $7FFD:$400B и $759D:$E60B в действительности адресуют к одной и той же ячейке. Иногда может быть интересно получить сплошной адрес ячейки, отсчитанный от начала памяти 0000:0000. Такое число получить очень просто: оно равно СЕГМЕНТ *16 + СМЕЩЕНИЕ.