Конспект по теме: « Вещественный тип данных» Учитель: Батракова Л.В.
Вещественный тип
Определение: Вещественный тип – это простой стандартный тип, предназначенный для хранения подмножества вещественных чисел и выполнения операций над ними.
В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа.
Вещественные числа могут быть представлены в виде с фиксированной точкой и с плавающей точкой. Первый вид вам хорошо известен - это обычная запись чисел: 0.1, 3.14 и т.д. Числа с плавающей точкой имеют формат mE+p, где 'm'- целое или дробное число, а E+p означает 10 в степени 'p'.
Пример: 10E-03 = 10 * 10-3 = 0.01
3.14E00 = 3.14 * 100 = 3.14
Существует 5 типов вещественного числа:
Длина, байт
|
Название
|
Количество значащих цифр
|
Диапазон десятичного порядка
|
4
|
Single
|
7..8
|
-45..+38
|
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
|
Например:
VAR
c, d, e : real;
d1, d2: double;
Вещественное число в Турбо Паскале занимает от 4 до 10 смежных байт и имеет следующую структуру в памяти ПК:
Здесь s - знаковый разряд числа; е - экспоненциальная часть; содержит двоичный порядок; m - мантисса числа.
Мантисса m имеет длину от 23 (для SINGLE) до 63 (для EXTENDED) двоичных разрядов, что и обеспечивает точность 7.. .8 для SINGLE и 19.. .20 для EXTENDED десятичных цифр. Десятичная точка (запятая) подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой (запятой).
Как видим, Турбо Паскаль характеризуется богатой гаммой вещественных типов, однако доступ к типам SINGLE, DOUBLE и EXTENDED возможен только при особых режимах компиляции. Дело в том, что эти типы рассчитаны на аппаратную поддержку арифметики с плавающей точкой и для их эффективного использования в состав ПК должен входить арифметический сопроцессор.
Компилятор Турбо Паскаля позволяет создавать программы, работающие на любых ПК (с сопроцессором или без него) и использующие любые вещественные типы. В процессе запуска Турбо Паскаль проверяет состав аппаратных средств и выявляет наличие или отсутствие сопроцессора.
Отметим, что арифметический сопроцессор всегда обрабатывает числа в формате EXTENDED, а три других вещественных типа в этом случае получаются простым усечением результатов до нужных размеров и применяются в основном для экономии памяти.
Следует учесть, что тип REAL оптимизирован для работы без сопроцессора. Если Ваш ПК оснащен сопроцессором, использование типа REAL приведет к дополнительным затратам времени на преобразование REAL к EXTENDED. Поэтому никогда не используйте REAL на ПК с сопроцессором, т.к. дополнительные затраты времени на преобразование типов могут свести на нет все преимущества сопроцессора. При разработке программ, критичных ко времени счета, следует заменять его типами SINGLE или DOUBLE: по сравнению с типом REAL скорость вычислений на машинах с сопроцессором в этом случае увеличивается в 2...3 раза. Если в ПК нет арифметического сопроцессора, скорость обработки данных всех вещественных типов приблизительно одинакова.
Особое положение в Турбо Паскале занимает тип СОМР, который трактуется как вещественное число без экспоненциальной и дробной частей. Фактически, СОМР - это «большое» целое число со знаком, сохраняющее 19...20 значащих десятичных цифр (во внутреннем представлении СОМР занимает 8 смежных байт). В то же время в выражениях СОМР полностью совместим с любыми другими вещественными типами: над ним определены все вещественные операции, он может использоваться как аргумент математических функций и т.д. Наиболее подходящей областью применения типа СОМР являются бухгалтерские расчеты: денежные суммы выражаются в копейках или центах и действия над ними сводятся к операциям с достаточно длинными целыми числами.
Операции над вещественными числами
-
Операции присваивания.
Примеры присвоения значения:
с := -125.6;
e := 10;
d := 1.e2; {1*102}
d1 := 1.2e-257; { 1.2*10-257 }
b := 32*a+Sin(x);
-
Арифметические операции (+, -,*,/)
При записи формул (выражений) в программе следует учитывать такую особенность: компьютер будет в первую очередь выполнять вычисления в скобках, затем операции умножения и деления, и в последнюю очередь- сложение и вычитание:
Операции с равным приоритетом (+ , - ), (*, /) выполняются слева направо в том порядке, как записаны в выражении. Если у программиста нет уверенности в том, что вычисления будут выполняться в нужном порядке, то лучше расставить лишние скобки, помня о том, что вычисления в скобках выполняются в первую очередь. Например, в выражении А+В*С/D-Е, согласно правилам языка Паскаль, сначала будет выполнено B*C, затем результат делится на D, и только после этого наступит очередь сложения и вычитания:
Если сложение и вычитание требуется выполнить в первую очередь, то следует соответствующим образом расставить скобки: (A+B)*C/(D-E), что в форме алгебраической записи будет выглядеть так:
-
Операции ввода-вывода.
Например, операторы Write(a, b, c); или Write(a); Write(b); Write(c); или Writeln(a, b, c); - выводят значения переменных "a", "b", "c" начиная с текущей позиции курсора.
Например, для вывода значений переменных "a", "b", "c" в трех строках экрана следует написать:
Writeln(a); Writeln(b); Writeln(c);
Оператор Writeln; переводит курсор на начало следующей строки экрана.
В операторах вывода допускается производить арифметические действия, например, оператор Writeln(32*a+Sin(x)); соответствует операторам b:=32*a+Sin(x); Writeln(b);
При выводе данных можно задавать формат вывода. Для этого после имени переменной ставится знак двоеточие " : ", например: Writeln(a:5:2); - при выводе значения переменной вещественного типа отводится 5 позиций (включая отрицательный знак и точку), из них 2 позиции отводится для вывода цифр в дробной части.
Если формат вывода не задавать, то вещественных чисел - в экспоненциальной форме с количеством цифр, соответствующих типу переменной, например, оператор Writeln('а=', a); выведет на экран надпись: a=5.0200000000E+00 (тип Real), либо
a=5. 02000000000000E+0000 (тип Double).
Перед вводом данных с клавиатуры желательно вывести на экран поясняющее сообщение. Для этого в программу следует включить оператор вывода, например: Write('введите значение а='); затем оператор Readln(a); При выполнении программы на экране появится надпись: введите значение а= . Оператор Readln(a); будет ждать ввода данных. Следует набрать на клавиатуре значение переменной "а", например, число и нажать клавишу Enter.
Для ввода значений нескольких переменных, например, a, b, c применяются конструкции вида: Readln(a); Readln(b); Readln(c); или Readln(a, b, c);
При вводе нескольких числовых данных, например, оператором Readln(a, b, c); необходимо после набора каждого значения переменной нажимать клавишу «Пробел», а в конце ввода - Enter.
-
Операции отношения (>,<,<>,>=,<=).
Желательно избегать равенства, т.к. значения приблизительные (с разной точностью).
Можно использовать в операторах сравнения if, в операторах цикла while и repeat.
Например:
If x<=0.1 then writeln(‘точка принадлежит плоскасти’);
While e<=0.1E-6 do begin … end;
Repeat … x:=x+0.1;… until x>2.5;
-
Стандартные функции
Для работы с вещественными данными могут использоваться встроенные математические функции,
Стандартные математические функции Турбо Паскаля
|
Обращение
|
Тип параметра
|
Тип результата
|
Примечание
|
abs (x)
|
Real
|
Real
|
Модуль аргумента
|
АrсТаn (х)
|
Real
|
Real
|
Арктангенс ( значение в радианах)
|
cos (х)
|
To же
|
То же
|
Косинус, угол в радианах
|
ехр (х)
|
"
|
"
|
Экспонента
|
frас (х)
|
"
|
"
|
Дробная часть числа
|
int(x)
|
"
|
"
|
Целая часть числа
|
ln(x)
|
"
|
"
|
Логарифм натуральный
|
Pi
|
-
|
"
|
л = 3.141592653...
|
Random
|
-
|
"
|
Псевдослучайное число, равномерно распределенное в диапазоне 0...[1]
|
Randomize
|
-
|
-
|
Инициация генератора псевдослучайных чисел
|
sin(x)
|
Real
|
Real
|
Синус, угол в радианах
|
sqr (x)
|
To же
|
То же
|
Квадрат аргумента
|
sqrt (x)
|
"
|
"
|
Корень квадратный
|
В Паскале отсутствует функция возведения числа в степень, а также нет тригонометрических функций tg(), ctg(), arcsin() и arccos(), но они могут быть реализованы сочетанием стандартных функций:
X n = EXP(N*LN(X));
tg(X) = SIN(X)/COS(X);
ctg(X) = COS(X)/SIN(X);
arcsin(X) = ARCTAN(X/SQRT(1-SQR(X)));
arccos(X) = ARCTAN(SQRT(1-SQR(X))/X).
Примеры:
-
Программа возведения положительного числа "x" в степень"n", т. е. y = xn. Расчет производится по формуле: y=Exp(n*ln(x)).
Program N_2; {возведение положительного числа в степень}
Var n, x, y : real;
BEGIN
Writeln('Возведение положительного числа x степень n');
Writeln('x = ');
Readln(x);
Write('n = ');
Readln(n);
y := exp(n*ln(x));
Writeln('результат y=', y:10:6);
readln; {задержка экрана до нажатия Enter}
END.
-
Программа вычисления конечной суммы денежного вклада в банк через N месяцев при ежемесячной процентной ставке "pr" (5% cоответствует pr=5).
PROGRAM VKLAD; {расчет конечной суммы вклада в банк}
var
S, Sn, pr : Real;
i, N : Integer;
Begin
Write('Введите начальную сумму вклада S=');
readln(S);
Write('Введите процент по вкладу pr=');
readln(pr);
Write('Введите количество месяцев вклада N=');
readln(N);
For i:= 1 to N do S:= S*(1+pr/100); { цикл произведений }
Writeln('Конечная сумма вклада S=', S:10:2);
readln
End.