
- •6.2. Структура программной единицы
- •6.3. Стиль записи программ на языке Паскаль
- •7. Типы данных в Паскале
- •7.1. Классификация типов данных в Турбо Паскале
- •7.2. Порядковые типы
- •7.2.1. Логический (булевский) тип
- •7.2.2. Целые типы
- •7.2.3. Перечисляемый тип
- •7.2.4. Тип – диапазон
- •7.2.5. Символьный тип
- •7.3. Вещественные типы
7.3. Вещественные типы
Внутреннее представление
Вещественные типы данных хранятся в памяти компьютера иначе, чем целые. Внутреннее представление вещественного числа состоит из двух частей — мантиссы и порядка, и каждая часть имеет знак. Например, число 0,087 представляется в виде 0,87x10-1, и в памяти хранится мантисса 87 и порядок -1 (для наглядности мы пренебрегли тем, что данные на самом деле представляются в двоичной системе счисления и несколько сложнее).
Существует несколько вещественных типов, различающихся точностью и диапазоном представления данных. Точность числа определяется длиной мантиссы, а диапазон — длиной порядка.
Вещественные типы данных
Тип |
Название |
Размер, байт |
Значащих десятичных цифр |
Диапазон значений
|
real |
Вещественный |
6 |
11-12 |
2.9е-39 .. 1.7е+38 |
single |
Одинарной точности |
4 |
7-8 |
1.5е-45 .. 3.4е+38 |
double |
Двойной точности |
8 |
15-16 |
5.0е-324 . . 1.7е+308 |
extended |
Расширенный |
10 |
19-20 |
3.4е-4932 .. 1.1е+4923
|
comp |
Большое целое |
8 |
19-20 |
-9.22е18 .. 9.22е18 (-263 .. 263-1) |
Примечание. Для первых четырех типов в таблице приведены абсолютные величины минимальных и максимальных значений.
Real является стандартным для Паскаля, все остальные относятся к стандартным типам сопроцессора. Из этих четырех типов первые три являются вещественными. Тип Comp на самом деле представляет собой длинные целые числа. Величины этого типа хранятся таким же образом, как целые, но отнести его к целым мешает то, что по области применимости он несколько отличается от остальных. Это объясняется тем, что тип Comp не относится к порядковым типам. Comp введен для того, чтобы с использованием сопроцессора можно было выполнять операцию над длинными целыми числами.
При наличии сопроцессора все операции выполняются над данными в форме типа данных Extended, все остальные значения получаются путем усечения значения типа Extended до нужной ширины в соответствии с заданным типом переменных.
Внутреннее представление переменных вещественных типов подробно рассматривается в курсе «Информатика». Для значений вещественных типов различают2 части:
- мантисса – нормализованное значение числа;
- порядок – число, показывающее степень, в которую надо возвести мантиссу, чтобы получить истинное значение числа. (из-за нормализации мантиссы).
Real
хранится в памяти так:
S M E Real
возрастание адресов справа налево
S E M Single
возрастание адресов справа налево
Все нормальные типы сопроцессора: Single, Double, Extended хранятся таким же образом.
Отличие в форме хранения типа Real приводит к следующему. Основным типом данных при наличии сопроцессора является тип Extended. Если при наличии сопроцессора выбран для представления вещественного значения тип Real, то каждый раз при присваивании значения переменных будет происходить преобразование из Extended в Real и программа будет выполняться значительно медленнее.
Если сопроцессор имеется, желательно не использовать тип данных Real, предпочтительнее - Single или Double. Программа будет выполняться в 2 раза быстрее.
На Паскале имеется возможность управлять характером работы с этими вещественными типами.
{$N+}
{$N-}
разрешить или запретить использовать типы данных сопроцессора:
директивы
разрешения (запрета) использования в
процессоре типа данных сопроцессора
Директива {$N+} задает, что разрешено использование всех 5 вещественных типов данных.
Директива {$N-} задает, что разрешено использование только тип Real.
По умолчанию действует {$N-}.
Данная установка перекрывает возможную установку, которая была сделана в среде.
При наличии {$N-} следующая запись будет считаться неправильной:
Var
v: Single;
Вы можете управлять, кто должен выполнять действия над данными вещественного типа:
аппаратными средствами (сопроцессором) с использованием его встроенных команд
программно (работа с типами данных сопроцессора эмулируется центральным процессором).
Директива {$E+} - разрешает эмуляцию сопроцессора, если его нет, а директива {$E-} - запрещает эмуляцию сопроцессора. По умолчанию действует {$E+}. Словоэмуляцияозначает моделирование (программное) работы сопроцессора, т.е. воспроизведение реальной работы сопроцессора на его программной модели.
Если использовать {$E-}, компилятором будет использован такой код, который нельзя выполнить на машине без сопроцессора.
{$N+} {$E+}
{$N+} {$E-}
{$N-} {$E+}
{$N-} {$E-}
1-я комбинация соответствует ситуации, когда разрешено использовать типы данных сопроцессора. Если сопроцессора нет, то он будет эмулироваться, если есть - будет сгенерирован код для работы без эмуляции.
2-я комбинация: директива компилятора {$N+} указывает, что будут использованы типы данных сопроцессора, причем работа с ними будет идти без эмуляции.
3-я и4-я: типы данных сопроцессора не используются и поэтому директива {$E}не играет роли.
Как быть, если мы заранее не знаем, есть ли сопроцессор или нет, т.е. можно ли использовать его типы данных без эмуляции или нет? Есть по крайней мере два варианта решения:
Если в программе используются все 5 вещественных типов данных, то можно поступить так:


{$IFDEF CPU87} В этом случае компилятор будет сам
{$N+} выбирать (в зависимости от наличия или

{$ELSE} директивы отсутствия сопроцессора) правильную

{$N-} условной модель генерации кода для работы с
{$ENDIF} компиляции вещественными числами
если при наличии сопроцессора надо вместо Real использовать Single, то можно записать так:

{$IFOPT N+} {$N } Здесь мы ввели свой тип float,
type или более сложно ……… под которым в зависимости
real=single; {$IFOPT N+} от наличия сопроцессора пони-
{$ENDIF} type float = single; мает то Real то Single
{$ELSE}
type float = real;
{$ENDIF}
Var R:float;
Рассмотрим теперь, что же можно делать с величинами вещественных типов, то есть какие к ним применяются операции и функции.
Операции
Арифметические операции для вещественных величин. Результат их выполнения — вещественный.
Операция |
Знак операции |
Сложение |
+ |
Вычитание |
- |
Умножение |
* |
Деление |
/ |
В общем случае при выполнении любой операции операнды должны быть одного и того же типа, но целые и вещественные величины смешивать разрешается. Иными словами, один из операндов может быть целого типа.
Примечание. Обратите внимание на то, что целочисленное и вещественное деление записываются с помощью разных операций. Если требуется получить вещественный результат деления двух целых величин, нужно использовать операцию /, если целый — операцию di v.
К вещественным величинам можно также применять операции отношения. Результат этих операций имеет логический тип.
Стандартные функции и процедуры для вещественных величин
Имя |
Описание |
Результат |
Пояснения |
abs |
Модуль |
Вещественный |
|х| записывается abs(x) |
arctan |
Арктангенс угла |
Вещественный |
arctg x записывается arctan(x) |
cos |
Косинус угла |
Вещественный |
cos x записывается cos(x) |
ехр |
Экспонента |
Вещественный |
ех записывается ехр(х) |
frac |
Дробная часть аргумента |
Вещественный |
frac(3.1) даст в результате 0,1 |
int |
Целая часть аргумента |
Вещественный |
int(3.1) даст в результате 3,0 |
ln |
Натуральный логарифм |
Вещественный |
logex записывается ln(х) |
pi |
Значение числа |
Вещественный |
3,1415926536 |
round |
Округление до целого |
Вещественный |
round(3.1) даст в результате 3 round (3.8) даст в результате 4 |
sin |
Синус угла |
Вещественный |
sin x записывается sin(x) |
sqr |
Квадрат |
Вещественный |
х2 записывается sqr(x) |
sqrt |
Квадратный корень |
Вещественный |
x записывается sqrt(x) |
trunc |
Целая часть аргумента |
Целый |
trunc(3.1) даст в результате 3 |