В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа.
Таблица 4.4
Длина, байт
Название
Количество значащих цифр
Диапазон десятичного порядка
Real
11. . .12
-39. ..+38
Double
15. ..16
-324. . .+308
extended
19. . .20
-4951. . .+4932
comp
19. . .20
-2*1063+1. . .+2*63-1
11. Как видно из табл.7, вещественное число в Турбо Паскале занимает от 4 до 10 смежных байт и имеет следующую структуру в памяти ПК:
s
e
m
12. Здесь s - знаковый разряд числа; е - экспоненциальная часть; содержит двоичный порядок; m - мантисса числа.
13. Мантисса m имеет длину от 23 (для SINGLE) до 63 (для EXTENDED) двоичных разрядов, что и обеспечивает точность 7.. .8 для SINGLE и 19.. .20 для EXTENDED десятичных цифр. Десятичная точка (запятая) подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой (запятой).
14. Как видим, Турбо Паскаль характеризуется богатой гаммой вещественных типов, однако доступ к типам SINGLE, DOUBLE и EXTENDED возможен только при особых режимах компиляции. Дело в том, что эти типы рассчитаны на аппаратную поддержку арифметики с плавающей точкой и для их эффективного использования в состав ПК должен входить арифметический сопроцессор. Компилятор Турбо Паскаля позволяет создавать программы, работающие на любых ПК (с сопроцессором или без него) и использующие любые вещественные типы. Необходимая для этого настройка компилятора описана в прил.1. В процессе запуска Турбо Паскаль проверяет состав аппаратных средств и выявляет наличие или отсутствие сопроцессора.
15. В некоторых случаях бывает необходимо отключить автоконтроль. Для этого перед запуском Турбо Паскаля следует дать такую команду ДОС:
16. set 87=N
17. команда
18. set 87=Y
19. напротив, включает автоконтроль - эта команда активна по умолчанию.
20. Отметим, что арифметический сопроцессор всегда обрабатывает числа в формате EXTENDED, а три других вещественных типа в этом случае получаются простым усечением результатов до нужных размеров и применяются в основном для экономии памяти.
21. Например, если «машинное эпсилон» (см. пример 2.6 в гл.2) вычисляется с помощью такой программы:
22. {$N+,E+}
23. type
24. RealType = Real:
25. var
26. epsilon : RealType;
27. begin
28. epsilon := 1;
29. while 1+epsilon/2 > 1 do
30. epsilon := epsilon/2;
31. WriteLn(epsilon)
32. end.
33. то независимо от объявления типа REALTYPE (он может быть SINGLE, REAL, DOUBLE или EXTENDED) на печать будет выдан результат
34. 1.08420217248550Е-0019
35. что соответствует типу EXTENDED. Происходит это по той причине, что все операнды вещественного выражения 1 + epsilon/2 в операторе WHILE, перед вычислением автоматически преобразуются к типу EXTENDED. Чтобы получить правильный результат (например, для типа REALTYPE = REAL он будет 9 . 09494701772928Е-0013), программу необходимо изменить следующим образом:
36. {$N+,E+}
37. type
38. RealType= Real;
39. var
40. epsilon, epsl:RealType;
41. begin
42. epsilon := 1;
43. repeat
44. epsilon := epsilon/2;
45. epsl := 1 + epsilon
46. until epsl = 1;
47. WriteLn(2*epsilon)
48. end.
49. Следует учесть, что тип REAL оптимизирован для работы без сопроцессора. Если Ваш ПК оснащен сопроцессором, использование типа REAL приведет к дополнительным затратам времени на преобразование REAL к EXTENDED. Поэтому никогда не используйте REAL на ПК с сопроцессором, т.к. дополнительные затраты времени на преобразование типов могут свести на нет все преимущества сопроцессора. При разработке программ, критичных ко времени счета, следует заменять его типами SINGLE или DOUBLE: по сравнению с типом REAL скорость вычислений на машинах с сопроцессором в этом случае увеличивается в 2...3 раза. Если в ПК нет арифметического сопроцессора, скорость обработки данных всех вещественных типов приблизительно одинакова.
50. Особое положение в Турбо Паскале занимает тип СОМР, который трактуется как вещественное число без экспоненциальной и дробной частей. Фактически, СОМР - это «большое» целое число со знаком, сохраняющее 19...20 значащих десятичных цифр (во внутреннем представлении СОМР занимает 8 смежных байт). В то же время в выражениях СОМР полностью совместим с любыми другими вещественными типами: над ним определены все вещественные операции, он может использоваться как аргумент математических функций и т.д. Наиболее подходящей областью применения типа СОМР являются бухгалтерские расчеты: денежные суммы выражаются в копейках или центах и действия над ними сводятся к операциям с достаточно длинными целыми числами.
51. Для работы с вещественными данными могут использоваться встроенные математические функции, представленные в табл. 2.5. В этой таблице REAL означает любой вещественный тип, INTEGER - любой целый тип.
52. Таблица 4.5
Стандартные математические функции Турбо Паскаля
53.
Обращение
Тип параметра
Тип результата
Примечание
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)