Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Вещественные типы. Сопроцессор





В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и, следовательно, представляются в ПК абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой конечной точностью, зависящей от внутреннего формата вещественного числа.

В переменных вещественных типов содержатся числа, состоящие из целой и дробной частей. В Object Pascal определено шесть вещественных типов. Все типы различаются пороговым (минимальным положительным) и максимальным значениями, а также точностью (количеством значащих цифр) и объемом (табл. 8).

Обратите внимание на четкое разделение целых и вещественных чисел. Операции с целыми числами всегда выполняются точно, а с вещественными – с погрешностью. Результат сложения двух целых чисел 2+2 всегда будет точно равен 4, а результат сложения двух вещественных чисел 2.0+2.0 может оказаться равным и 3.9999999, и 4.000001. Такова особенность машинной арифметики. Это не ошибка языка Паскаль или процессора, а свойство любого компьютера.

Четкое разделение целого и вещественного типов потребовало введения двух разных операций деления: деление нацело (обозначается DIV) и вещественного деления (обозначается "/"). Не забывайте, что 10 DIV 3=3, а 10/3=3.33333.

 

Таблица 8 - Вещественные типы данных

Название Диапазон значений Количество значащих цифр Размер, байт
Real 5.0e-324…1.7e308 15-16
Single 1.5e-45…3.4e38 7-8
Double 5.0e-324…1.7e308 15-16
Extended 3.4e-4951…1.1e4932 19-20
Comp -2e63…+2e63-1 19-20
Currency +/- 922 337 203 685 477.5807; 19-20

 

Вещественное число в памяти компьютера представляется следующим образом:

S e m

Здесь s - знаковый разряд числа, е - экспонента, m - мантисса. Длина мантиссы меняется от 23 двоичных разрядов (тип Single) до 63 (тип Extended). Это обеспечивает точность десятичных цифр 7-8 для Single и 19-20 для Extended. Десятичная точка (запятая) подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой (запятой).



Сопроцессор - это устройство, расширяющее возможности центрального процессора, добавляющее команды числовой обработки и регистры с плавающей точкой. Эти дополнительные арифметические возможности расширяют набор команд микропроцессора, и значительно увеличивают вычислительную мощность в тех случаях, когда программа выполняет операции с плавающей точкой или с арифметикой повышенной точности.

Модели процессоров (начиная с Pentium) выпускаются уже со встроенным сопроцессором.

Сопроцессор - весьма сложное устройство. Это полноценный процессор со своим набором регистров (включая управляющие). Сопроцессор может работать независимо от основного процессора и параллельно с ним. Т.е. это вроде как отдельный вычислительный блок, и его нужно рассматривать именно как отдельное устройство.

Сопроцессор "смотрит" на команды, выполняемые процессором. Когда сопроцессор "видит" команду, которую он должен выполнить, он начинает ее обработку. Сопроцессор выполняет свои числовые операции параллельно с процессором. То есть, пока сопроцессор выполняет арифметическую команду, процессор может продолжать выполнять свои команды. Тем самым возникает истинная параллельность работы; процессор может выполнять команду, пока сопроцессор выполняет другую команду. В частности, это имеет значение в случае, когда команда сопроцессора занимает много времени, что характерно для некоторых команд с плавающей точкой.

Процессор не может читать внутренние регистры сопроцессора, и наоборот. Все данные, передаваемые между ними, должны быть помещены в память, к которой оба процессора имеют доступ. Но из-за того, что регистры адресации находятся в процессоре, сопроцессору трудно эффективно адресовать память, используя те же способы адресации, которые использует процессор. Чтобы позволить сопроцессору адресовать память с помощью способов адресации процессора, существует взаимодействие двух процессоров при выполнении команд плавающей точки.

Сопроцессор добавляет арифметические возможности в систему, но не замещает ни одну команду процессора. Команды ADD, SUB, MUL и DIV выполняются процессором, а арифметический сопроцессор выполняет дополнительные, более эффективные команды арифметической обработки.

Каждый сопроцессор имеет собственный набор команд и средства для операций с плавающей запятой для выполнения экспоненциальных, логарифмических и тригонометрических функций. Сопроцессор содержит 80-битовые регистры с плавающей запятой, которые могут представить числовые значения до 10 в 400 степени. Математические вычисления в сопроцессоре выполняются примерно в 100 раз быстрее, чем в основном процессоре.

Основной процессор выполняет специальные операции и передает числовые данные в сопроцессор, который выполняет необходимые вычисления и возвращает результат.

Для изображения чисел с плавающей точкой в сопроцессоре существует три формата данных.

Короткий формат имеет 32 бита, а длинный - 64 бита. Третий формат определяет 80-битовые числа. Сопроцессор использует такой формат "промежуточного действительного числа", чтобы обеспечить очень высокую точность для промежуточных результатов вычислений.

Ученые и математики давным-давно разработали способ представления вещественных чисел в достаточно удобном виде. На первом этапе вводится десятичная точка. Этот символ "." показывает границу между целой и дробной частью числа. В случае целого числа позиция, представляющая единицы, всегда находится на правом краю числа; в случае, когда используется десятичная точка, цифры справа от нее представляют значения, меньшие единицы.

Десятичная точка позволяет записывать дроби. Число 1/2 теперь выглядит как 0.5, а 1/4 выглядит как 0.25, и 1/5 выглядит как 0.2.

Поскольку каждая позиция десятичного числа отличается от соседней на степень 10, умножение числа на 10 эквивалентно сдвигу десятичной точки на одну позицию вправо. Аналогично деление на 10 сдвигает десятичную точку на позицию влево. Это свойство можно использовать для сдвига десятичной точки на соответствующее место: мы сдвигаем десятичную точку и одновременно корректируем число на степень 10. Такое представление чисел называется представлением "с плавающей точкой", поскольку десятичная точка "плавает" в числе - она больше не помечает абсолютное место между целой и дробной частями. Положение десятичной точки можно выбрать из соображений удобства, а затем умножить число на нужную степень 10, чтобы получить правильное значение.

 

Отметим, что арифметический сопроцессор всегда обрабатывает числа в формате Extended, а три других вещественных типа в этом случае получаются простым усечением результатов до нужных размеров и применяются в основном для экономии памяти.

 

Особое положение в Object Pascal занимают типы Comp и Currency, которые трактуются как вещественные числа с дробными частями фиксированной длины: в Comp дробная часть имеет длину 0 разрядов, т.е. просто отсутствует, в Currency длина дробной части -4 десятичных разряда.

Фактически оба типа определяют большое целое число со знаком, сохраняющее 19...20 значащих десятичных цифр (во внутреннем представлении они занимают 8 смежных байт). В то же время в выражениях Comp и Currency полностью совместимы с любыми другими вещественными типами: над ними определены все вещественные операции, они могут использоваться как аргументы математических функций и т.д.

Типы Currency и Comp являются типами с фиксированной десятичной точкой. Работа с ними осуществляется быстрее и проще, чем с остальными вещественными числами с плавающей точкой. Наиболее подходящей областью применения этих типов являются бухгалтерские расчеты.

Типы Real, Single, Double и Extended - типы с так называемой плавающей десятичной точкой. Десятичная точка подразумевается перед старшим байтом мантиссы, но при арифметических действиях с числом она сдвигается вправо или влево (зависит от операции и двоичного порядка числа). Операции с типами Real, Single, Double и Extended называют арифметикой с плавающей точкой.

Текстовые типы

Текстовые (символьные) типы - это типы данных, состоящие из одного символа. В Windows используется код ANSI (по названию разработавшего этот код института - American National Standard Institute - американский национальный институт стандартизации). Множество значений символьного типа состоит из 256 различных символов, определенным образом упорядоченных, и содержит символы заглавных и строчных букв, цифр и других различных символов, включая специальные управляющие.

В Object Pascal есть три символьных типа: Char, AnsiChar, и WideChar (табл.9). Тип Char является стандартным типом Pascal. Он использовался и в Turbo Pascal и сейчас в Object Pascal. Типы AnsiChar, и WideChar были добавлены позднее.

Таблица 9 - Символьные типы данных

Название Размер, байт
Char
AnsiChar
WideChar

Char - любой символ из набора ANSI.

AnsiChar - символы, упорядоченные в соответствии с расширенным набором символов ANSI.

WideChar - это символы, упорядоченные в соответствии с международным набором символов UNICODE. Первые 256 символов совпадают с символами ANSI.

С типом CHAR работают следующие процедуры и функции:

- функция Ord (Ch), где Ch - любая переменная символьного типа, возвращает целое значение, которым символ Ch представлен в памяти, т.е. порядковый номер этого символа в таблице ANSI.

- для преобразования целой переменной в переменную типа char с тем же порядковым номером предназначена функция Chr(Ch).

- UpCase () преобразует строчную букву в прописную.

Тип CHAR упорядочен по алфавиту: ‘A’<‘B’<‘C’…<‘Z’. Это позволяет сравнивать буквы для их алфавитной сортировки. Наконец, тип CHAR эквивалентен типу BYTE – оба они занимают один и тот же объем памяти. Для эквивалентных типов можно применять операцию типизации, заключающейся в преобразовании типа в нужный. Например, чтобы напечатать символ с кодом n, необязательно делать так:

Label1.Caption:=CHR(n);

Есть другой способ:

Label1.Caption:=CHAR(n);

Здесь CHAR() – операция типизации. Возможна и обратная процедура для получения кода символа:

Label1.Caption:=IntToStr ((BYTE(c)))

Логический тип

Логический тип данных, названный в честь английского математика XIX века Дж. Буля кажется очень простым. Но с ним связан ряд интересных моментов.

Во-первых, к данным этого типа применимы логические операции AND, OR, XOR, NOT. Как правило, труднее всего понять операцию "исключающее ИЛИ" (XOR). Ее смысл: "или одно, или другое, но не оба сразу". Поэтому True XOR False=True, но True XOR True=False.

Во-вторых, допустимы присваивания вида:

 

VAR l:BOOLEAN;

l:=(a>b) OR (c<4);

 

Очень частая ошибка начинающего программиста – использование оператора IF там, где достаточно применить булевский тип данных. Вот так делать не надо:

 

IF (a>b) AND (d<0) THEN c:=TRUE

ELSE c:=FALSE;

 

Все гораздо проще:

 

c:=(a>b) AND (d<0);

 

В-третьих, операции AND и OR могут быть выполнены при неизвестном втором операнде:

 

IF (a>5) AND (c<d) THEN…

 

Если a<=5, то условие c<d вообще не проверяется, так как при любом его значении результат всего выражения уже известен.

 

В Object Pascal имеется пять логических типов: Boolean ByteBool, Bool, WordBool и LongBool, отличающиеся занимаемым объемом памяти (табл.10).

Таблица 10 - Логические типы данных

Название Размер, байт
Boolean
ByteBool
Bool
WordBool
LongBool

В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по одному байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта. Значениями логического типа может быть одна из предварительно объявленных констант False (ложь) или True (истина).

При этом справедливы следующие условия:

False < True;

Ord(False) = 0;

Ord(True) <> 0;

Succ(False) = True;

Pred(True) = False.

Фактически для всех логических типов значению False соответствует число 0, которое записывается в указанное в Таблица 10 количество байтов. Отличие логических типов заключается в величине параметра, соответствующего значению True. В величинах типа Boolean этому значению соответствует число 1, а для других типов результату True соответствует любое значение, отличное от нуля. Функция Ord(True) для Boolean вернет 1, а для всех других логических типов возвратит (-1).









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2019 zdamsam.ru Размещенные материалы защищены законодательством РФ.