Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции СД.doc
Скачиваний:
212
Добавлен:
19.03.2015
Размер:
1.81 Mб
Скачать
    1. 2.8. Вещественный тип

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

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

Тип

Диапазон значений

Значащие цифры

Размер в байтах

Real

2.9·10-39..1.7·1038

11-12

6

Single

1.4·10-45..3.4·1038

7-8

4

Double

4.9·10-324..1.8·10308

15-16

8

Extended

3.1·10-4944..1.2·104932

19-20

10

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

const

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 ошибка уменьшается от исчезновения слагаемого, и результат получается более точным.