Представление вещественных чисел 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Представление вещественных чисел



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

тип длина мантисса показатель

float 4 байта 23 бита 8 битов

double 8 байтов 52 бита 11 битов

Машинное представление вещественного числа с плавающей точкой имеет следующий вид: +/- M * 2E, где M – вещественная мантисса, E – целочисленный показатель. Мантисса представлена в виде последовательности разрядов двоичной дроби:

M = M0 + M1/2 + M2/4 +... + Mn/2n

Для представления всех вещественных чисел кроме нуля используется нормализованная форма, когда нулевой разряд мантиссы M0 равен 1. При таком представлении нулевой разряд опускается, и хранятся только разряды M1... Mn. Таким образом, мантисса M удовлетворяет неравенству 1 <= M < 2.

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

Простые примеры

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

float x4 = 0.1;

double x8 = 0.1;

не стоит надеяться, что x4 == 0.1 или x8 == 0.1. Дело в том, что при сравнении используется 10-байтовое представление для константы 0.1, не совпадающее с 8-байтовым в случае переменной x8 и 4-байтовым для x4. Ясно, что по аналогичной причине не будет выполнено равенство x4 == x8.

Последовательные операции с непредставимыми числами могут приводить к накоплению погрешности. Например, если просуммировать 1000 4-байтовых представлений (float) числа 0.1, то мы получим результат, отличающийся на 0.000953674 от точного. Это — вполне заметная погрешность.

Просуммируем вещественные числа вида 1.0/j при j = 1...1000 в разном порядке — по возрастанию и по убыванию. При использовании вещественной арифметики однократной точности (float) полученные результаты будут отличаться на 6.67572e-006.

Первые выводы

§ При работе с вещественными числами на точное равенство надеяться не стоит даже при проведении простейших вычислений.

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

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

Модельная арифметика

Для построения примеров удобно использовать следующую модельную арифметику. Пусть наш воображаемый компьютер использует десятичную систему счисления, причем мантисса имеет 4 десятичных разряда, а показатель — 2 десятичных разряда. Вот одно из вещественных чисел, представимых в такой арифметике: 9.876e-12. Ясно, что таких вещественных чисел имеется лишь конечное число, причем в нашей арифметике есть минимальное и максимальное числа:

min = -9.999e99,

max = 9.999e99.

Есть также минимальное положительное число:

min_pos = 1.000e-99.

Потеря значимости

Рассмотрим в описанной выше модельной арифметике операцию сложения чисел 1.234e00 и 5.678e-04:

1.234e00 + 5.678e-05 = 1.234 + 0.00005678 = 1.23405678

Это число непредставимо в нашей арифметике и будет заменено ближайшим представимым:

1.234e00 + 5.678e-05 = 1.234e00

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

Машинный эпсилон

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

Абсолютное значение «машинного эпсилон» зависит от разрядности сетки применяемой ЭВМ, типа (разрядности) используемых при расчетах чисел, и от принятой в конкретном трансляторе структуры представления вещественных чисел (количества бит, отводимых на мантиссу и на порядок). Формально машинное эпсилон обычно определяют как минимальное из чисел eps, для которого 1+eps>1 при машинных расчетах с числами данного типа. Альтернативное определение - максимальное положительное eps, для которого справедливо равенство 1+eps=1. Практическая важность машинного эпсилон связана с тем, что два (отличных от нуля) числа являются одинаковыми с точки зрения машинной арифметики, если их относительная разность по модулю меньше (при определении первого типа) или не превосходит (при определении второго типа) машинного эпсилон.

Пример вычисления машинного эпсилона (не путать с машинным нулём) на языке Си.

float macheps(void)

{

float e = 1.0f;

while (1.0f + e / 2.0f > 1.0f)

          e /= 2.0f;

return e;

}

Рассмотрим более подробно операцию сложения двух положительных чисел. Пусть x > y > 0. Тогда

x + y = x * (1 + y/x)

Если число y/x окажется настолько маленьким, что 1 + y/x = 1, то мы получим потерю значимости: x + y = x.

Машинным эпсилон называется минимальное положительное число, которое при сложении с числом 1.0 дает результат, больший, чем 1.0. Машинное эпсилон — наиболее важная характеристика вещественной арифметики. В нашей модельной арифметике машинное эпсилон равно 0.001 = 1.000e-03.



Поделиться:


Последнее изменение этой страницы: 2021-04-20; просмотров: 243; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.2.15 (0.006 с.)