|
Вещественные типы
В отличие от порядковых
типов, значения которых всегда сопоставляются с рядом
целых чисел и, следовательно, представляются в ПК абсолютно
точно, значения вещественных типов определяют произвольное
число лишь с некоторой конечной точностью, зависящей
от внутреннего формата вещественного числа.
Таблица 4.4
|
Длина, байт
|
Название
|
Количество значащих цифр
|
Диапазон десятичного порядка
|
|
6
|
Real
|
11. . .12
|
-39. ..+38
|
|
8
|
Double
|
15. ..16
|
-324. . .+308
|
|
10
|
extended
|
19. . .20
|
-4951. . .+4932
|
|
8
|
comp
|
19. . .20
|
-2*1063+1. . .+2*63-1
|
Как видно из табл.4.4, вещественное число в Турбо
Паскале занимает от 6 до 10 смежных байт и имеет следующую
структуру в памяти ПК:
Здесь s - знаковый разряд числа; е - экспоненциальная
часть; содержит двоичный порядок; m - мантисса числа.
Мантисса m имеет длину от 23 (для SINGLE) до 63 (для
EXTENDED) двоичных разрядов, что и обеспечивает точность
7.. .8 для SINGLE и 19.. .20 для EXTENDED десятичных
цифр. Десятичная точка (запятая) подразумевается перед
левым (старшим) разрядом мантиссы, но при действиях
с числом ее положение сдвигается влево или вправо в
соответствии с двоичным порядком числа, хранящимся в
экспоненциальной части, поэтому действия над вещественными
числами называют арифметикой с плавающей точкой (запятой).
Как видим, Турбо Паскаль характеризуется богатой гаммой
вещественных типов, однако доступ к типам SINGLE, DOUBLE
и EXTENDED возможен только при особых режимах компиляции.
Дело в том, что эти типы рассчитаны на аппаратную поддержку
арифметики с плавающей точкой и для их эффективного
использования в состав ПК должен входить арифметический
сопроцессор. Компилятор Турбо Паскаля позволяет создавать
программы, работающие на любых ПК (с сопроцессором или
без него) и использующие любые вещественные типы. Необходимая
для этого настройка компилятора описана в прил.1. В
процессе запуска Турбо Паскаль проверяет состав аппаратных
средств и выявляет наличие или отсутствие сопроцессора.
В некоторых случаях бывает необходимо отключить автоконтроль.
Для этого перед запуском Турбо Паскаля следует дать
такую команду ДОС:
set 87=N
команда
set 87=Y
напротив, включает автоконтроль - эта команда активна
по умолчанию.
Отметим, что арифметический сопроцессор всегда обрабатывает
числа в формате EXTENDED, а три других вещественных
типа в этом случае получаются простым усечением результатов
до нужных размеров и применяются в основном для экономии
памяти.
Например, если «машинное эпсилон» (см. пример 2.6 в
гл.2) вычисляется с помощью такой программы:
{$N+,E+}
type
RealType = Real:
var
epsilon : RealType;
begin
epsilon := 1;
while 1+epsilon/2 > 1 do
epsilon := epsilon/2;
WriteLn(epsilon)
end.
то независимо от объявления типа REALTYPE (он может
быть SINGLE, REAL, DOUBLE или EXTENDED) на печать будет
выдан результат
1.08420217248550Е-0019
что соответствует типу EXTENDED. Происходит это по
той причине, что все операнды вещественного выражения
1 + epsilon/2 в операторе WHILE, перед вычислением автоматически
преобразуются к типу EXTENDED. Чтобы получить правильный
результат (например, для типа REALTYPE = REAL он будет
9 . 09494701772928Е-0013), программу необходимо изменить
следующим образом:
{$N+,E+}
type
RealType= Real;
var
epsilon, epsl:RealType;
begin
epsilon := 1;
repeat
epsilon := epsilon/2;
epsl := 1 + epsilon
until epsl = 1;
WriteLn(2*epsilon)
end.
Следует учесть, что тип REAL оптимизирован для работы
без сопроцессора. Если Ваш ПК оснащен сопроцессором,
использование типа REAL приведет к дополнительным затратам
времени на преобразование REAL к EXTENDED. Поэтому никогда
не используйте REAL на ПК с сопроцессором, т.к. дополнительные
затраты времени на преобразование типов могут свести
на нет все преимущества сопроцессора. При разработке
программ, критичных ко времени счета, следует заменять
его типами SINGLE или DOUBLE: по сравнению с типом REAL
скорость вычислений на машинах с сопроцессором в этом
случае увеличивается в 2...3 раза. Если в ПК нет арифметического
сопроцессора, скорость обработки данных всех вещественных
типов приблизительно одинакова.
Особое положение в Турбо Паскале занимает тип СОМР,
который трактуется как вещественное число без экспоненциальной
и дробной частей. Фактически, СОМР - это «большое» целое
число со знаком, сохраняющее 19...20 значащих десятичных
цифр (во внутреннем представлении СОМР занимает 8 смежных
байт). В то же время в выражениях СОМР полностью совместим
с любыми другими вещественными типами: над ним определены
все вещественные операции, он может использоваться как
аргумент математических функций и т.д. Наиболее подходящей
областью применения типа СОМР являются бухгалтерские
расчеты: денежные суммы выражаются в копейках или центах
и действия над ними сводятся к операциям с достаточно
длинными целыми числами.
Для работы с вещественными данными могут использоваться
встроенные математические функции, представленные в
табл. 2.5. В этой таблице REAL означает любой вещественный
тип, INTEGER - любой целый тип.
Таблица 4.5
|
Стандартные математические функции Турбо Паскаля
|
|
Обращение
|
Тип параметра
|
Тип результата
|
Примечание
|
|
abs (x)
|
Real, Integer
|
Тип аргумента
|
Модуль аргумента
|
|
АrсТаn (х)
|
Real
|
Real
|
Арктангенс ( значение в радианах)
|
|
cos (х)
|
To же
|
То же
|
Косинус, угол в радианах
|
|
ехр (х)
|
"
|
"
|
Экспонента
|
|
frас (х)
|
"
|
"
|
Дробная часть числа
|
|
int(x)
|
"
|
"
|
Целая часть числа
|
|
ln(x)
|
"
|
"
|
Логарифм натуральный
|
|
Pi
|
-
|
"
|
л = 3.141592653...
|
|
Random
|
-
|
"
|
Псевдослучайное число, равномерно распределенное
в диапазоне 0...[1]
|
|
Pandom(x)
|
Integer
|
Integer
|
Псевдослучайное целое число, равномерно распределенное
в диапазоне 0...(х-1)
|
|
Randomize
|
-
|
-
|
Инициация генератора псевдослучайных чисел
|
|
sin(x)
|
Real
|
Real
|
Синус, угол в радианах
|
|
sqr (x)
|
To же
|
То же
|
Квадрат аргумента
|
|
sqrt (x)
|
"
|
"
|
Корень квадратный
|
|