Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Указательный тип

Const

Вещественный тип

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

Табл. 2.5. Вещественные типы.

Тип Диапазон значений Значащие цифры Размер в байтах
Real 2.9·10-39..1.7·1038 11-12  
Single 1.4·10-45..3.4·1038 7-8  
Double 4.9·10-324..1.8·10308 15-16  
Extended 3.1·10-4944..1.2·104932 19-20  

 

 

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

 

pi: Real = 3.1415926;

eq: Real = 1.19e-31;

 

Для вычислений с плавающей запятой необходимо минимум 32 разряда (одинарная точность, тип Single). Однако часто и одинарной точности оказывается недостаточно, поэтому языки поддерживают объявления переменных и вычисления с двойной точностью 64 разряда (тип Double).

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

 

 

Табл. 2.6. Стандартные арифметические функции.

Функция Назначение Тип результата
Abs(x) Абсолютное значение аргумента. совпадает с x
Arctan(x) Арктангенс аргумента. вещественный
Cos(x) Косинус аргумента. -//-
Exp(x) Вычисление экспоненты. -//-
Frac(x) Дробная часть аргумента. -//-
Int(x) Целая часть числа. -//-
Ln(x) Натуральный логарифм. -//-
Pi(x) Число pi = 3.1415926535897932385. -//-
Round(x) Округление до ближайшего целого. -//-
Sin(x) Синус аргумента. -//-
Sqr(x) Квадрат аргумента. совпадает с x
Sqrt(x) Квадратный корень аргумента. вещественный
Trunc(x) Целая часть вещественного числа. -//-

 

 

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

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

 

0.1234 x 103 + 0.1234 x 10-4 = 0.1234 x 103

 

второй операнд будет игнорирован вследствие своей малой величины.

 

Умножение ошибки – это большая абсолютная ошибка, которая может появиться при использовании арифметики с плавающей точкой, даже если относительная ошибка мала. Обычно это является результатом операции умножения или деления. Рассмотрим вычисление x*x:

 

0.1234 x 103 * 0.1234 x 103 = 0.1522 x 105

 

и предположим, что при вычислении x произошла ошибка на единицу младшего разряда, что соответствует абсолютной ошибке 0.1:

 

0.1235 x 103 * 0.1235 x 103 = 0.1525 x 105

 

Абсолютная ошибка теперь равна 30, что на порядок превышает исходную ошибку.

Полная потеря значимости – наиболее грубая ошибка, вызванная вычитанием почти равных чисел:

 

f1 = 0.12342;

f2 = 0.12346;

 

В математике f2 – f1 = 0.00004, что, конечно, вполне представимо как четырехразрядное число с плавающей точкой: 0.4000x10-4. Однако программа, выполняющая вычисление разности в четырехразрядном представлении с плавающей точкой даст ответ:

 

0.1235 – 0.1234 = 0.1000 x 10-3

 

что даже приблизительно не является приемлемым ответом.

Потеря значимости встречается довольно часто, поскольку проверка на равенство реализуется вычитанием и последующим сравнением с нулем. Следующее выражение для вещественных чисел f1 и f2 недопустимо:

 

если f1 = f2, тогда...

 

Правильный способ проверки равенства с плавающей точкой состоит в том, чтобы ввести малую величину epsilon:

 

если |f2 – f1| < epsilon, тогда...

 

и затем сравнивать с ней абсолютную разницу.

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

 

1234.0 + 0.5678 + 0.5678 = 1234.0

 

лучше изменить порядок, чтобы не было исчезновения слагаемых:

 

0.5678 + 0.5678 + 1234.0 = 1235.0

 

В качестве другого примера рассмотрим арифметическое тождество:

 

(x + y)*(x – y) = x2 – y2

 

При вычислении выражения небольшая ошибка, являющаяся результатом сложения и вычитания, значительно возрастает при умножении. При вычислении выражения по формуле x2 – y2 ошибка уменьшается от исчезновения слагаемого, и результат получается более точным.

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

Указательный тип данных позволяет использовать динамические переменные, когда выделение и освобождение памяти заданного объема выполняется по явному требованию. Ячейки памяти, относящейся к динамической области, могут неоднократно выделяться и освобождаться по необходимости во время выполнения программы. Выделение и освобождение динамической памяти может быть очень хаотичным.

Указатель (ссылка) – переменная, значением которой является физический адрес некоторой ячейки памяти. Адрес занимает 4 смежных байта памяти (два слова). Поскольку переменные большинства типов данных занимают несколько смежных байтов, то указатель содержит адрес первой ячейки памяти. Необходимость использования указателей при решении прикладных задач с использованием языков высокого уровня существует очень часто.

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

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

Значением указательного типа (pointer type) является адрес другой переменной или константы. Объект, на который указывает указатель, называют указуемым. Указатели используются для выполнения операций над адресами ячеек (рис. 2.3).

 
 

 


Рис. 2.3. Переменная-указатель и указуемая переменная.

 

 

В примере указатель ptr является переменной, расположенной в памяти по адресу 100. Содержимое этой ячейки, значение 200, является фактическим адресом переменной, которая содержит значение 50. К переменной можно получить доступ, просто обращаясь к ней по имени, но также можно использовать и разыменование указателя. При выполнении операции разыменования, получают не содержимое переменной указателя ptr, а содержимое ячейки памяти, адрес которой содержится в ptr, т.е. указуемый объект.

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

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

Операция получения адреса – одноместная, ее операнд может иметь любой тип, результатом является типизированный (в соответствии с типом операнда) указатель, содержащий адрес объекта-операнда.

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

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

Результат операций «указатель + целое» и «указатель – целое» имеет тип «указатель». Можно вычесть один указатель из другого (оба указателя-операнда при этом должны иметь одинаковый тип). Результат такого вычитания будет иметь тип целого числа со знаком. Его значение показывает, на сколько байт (или других единиц измерения) один адрес отстоит от другого.

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

Типизированные указатели. При объявлении типизированного указателя всегда должен быть определен тип объекта, адресуемого указателем. При определении типа-указателя используется базовый тип, перед которым ставится признак указателя «^». По соглашению, идентификаторы типа указателя и переменной-указателя начинаются с заглавной буквы P.

Описание типизированного указателя имеет вид:

 

<== предыдущая лекция | следующая лекция ==>
Битовый тип | Объектные типы данных
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 457; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.019 сек.