Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Ошибки переполнения

Читайте также:
  1. В документе «Текст для редактирования» проведите проверку орфографии, исправив все орфографические и грамматические ошибки.
  2. Глава 13. Почему другие едят больше и не полнеют? Исправление ошибки в главном положении диетологии
  3. ЕСЛИ БЫ НЕ ОШИБКИ ГИТЛЕРА И, ОПЯТЬ-ТАКИ, ПЛОХАЯ ПОГОДА И ПЛОХИЕ ДОРОГИ, ТО К ОСЕНИ 1941 ГОДА ГЕРМАНИЯ МОГЛА БЫ ВЫИГРАТЬ ВОЙНУ, А ГИТЛЕР – ПРИНЯТЬ ПАРАД ВЕРМАХТА НА КРАСНОЙ ПЛОЩАДИ 1 страница
  4. ЕСЛИ БЫ НЕ ОШИБКИ ГИТЛЕРА И, ОПЯТЬ-ТАКИ, ПЛОХАЯ ПОГОДА И ПЛОХИЕ ДОРОГИ, ТО К ОСЕНИ 1941 ГОДА ГЕРМАНИЯ МОГЛА БЫ ВЫИГРАТЬ ВОЙНУ, А ГИТЛЕР – ПРИНЯТЬ ПАРАД ВЕРМАХТА НА КРАСНОЙ ПЛОЩАДИ 2 страница
  5. ЕСЛИ БЫ НЕ ОШИБКИ ГИТЛЕРА И, ОПЯТЬ-ТАКИ, ПЛОХАЯ ПОГОДА И ПЛОХИЕ ДОРОГИ, ТО К ОСЕНИ 1941 ГОДА ГЕРМАНИЯ МОГЛА БЫ ВЫИГРАТЬ ВОЙНУ, А ГИТЛЕР – ПРИНЯТЬ ПАРАД ВЕРМАХТА НА КРАСНОЙ ПЛОЩАДИ 3 страница
  6. ЕСЛИ БЫ НЕ ОШИБКИ ГИТЛЕРА И, ОПЯТЬ-ТАКИ, ПЛОХАЯ ПОГОДА И ПЛОХИЕ ДОРОГИ, ТО К ОСЕНИ 1941 ГОДА ГЕРМАНИЯ МОГЛА БЫ ВЫИГРАТЬ ВОЙНУ, А ГИТЛЕР – ПРИНЯТЬ ПАРАД ВЕРМАХТА НА КРАСНОЙ ПЛОЩАДИ 4 страница
  7. ЕСЛИ БЫ НЕ ОШИБКИ ГИТЛЕРА И, ОПЯТЬ-ТАКИ, ПЛОХАЯ ПОГОДА И ПЛОХИЕ ДОРОГИ, ТО К ОСЕНИ 1941 ГОДА ГЕРМАНИЯ МОГЛА БЫ ВЫИГРАТЬ ВОЙНУ, А ГИТЛЕР – ПРИНЯТЬ ПАРАД ВЕРМАХТА НА КРАСНОЙ ПЛОЩАДИ 5 страница

Пусть для представления вещественного числа выделено 3 разряда под мантиссу и 2 под порядок.

Тогда при сложении двух чисел 0.999*1098 и 0.976*1099 имеем:

0.999*1098 + 0.976*1099 = 0.099(9)*1099 + 0.976*1099 = 0.100*1099 + 0.976*1099 = 1.076*1099 = 0.108*10 100 = 0.108*10** т.к. числа сначала приводятся к одинаковому – большему порядку, затем производится сложение мантисс и после этого повторная нормализация, при которой значение нового порядка 100 выходит за отведенные ему 2 разряда, т.е. имеем ошибку переполнения.

Тогда при умножении двух чисел 0.823*1046 и 0.101*1065 имеем:

0.823*1046 * 0.101*1065 = 0.83123*10**, т.к. значение порядка 111 выходит за отведенные ему 2 разряда, т.е. имеем ошибку переполнения.

Потеря (исчезновение) порядка

Пусть для представления вещественного числа выделено 3 разряда под мантиссу и 2 под порядок.

Тогда при делении двух чисел 0.425*10-27 и 0.561*1078 имеем:

0.425*10-27/0.561*1078 = 0.0757575…*10 -105 = 0.757575…*10-106 = 0, т.е. все значения с порядком, меньшим чем (-99) будут восприниматься как «машинный нуль».

Катастрофическая потеря порядка

Пусть для представления вещественного числа выделено 3 разряда под мантиссу и 2 под порядок. Тогда имеем:

0.425*10-27/0.561*1078*0.200*1087=0.0757575…*10-105*0.200*1087=0.757575…*
10-106*0.200*1087=0, т.к. из предыдущего примера мы знаем, что 0.757575…*10-106 есть 0 (вместо ожидаемого результата 0.1515151*10-19).

Потеря значащих цифр

При выполнении операций сложения и вычитания вещественных чисел может произойти потеря значащих цифр. Например,

¨ 10-9.82 = 0.18 (ожидаем)

10-9.82 = 0.100*1002–0.982*1001 = 0.100*1002–0.0982*1002=
0.100*1002–0.098*1002 = 0.002*1002 = 0.2 (получаем, если проводилось усечение).

¨ 1000 – 999 = 1 (ожидаем)

1000 – 999 = 0.100*1004 – 0.999*1003 = 0.100*1004 – 0.0999*1004 =
0.100*1004 – 0.100*1004=0 (получаем, если проводилось округление) или
1000 – 999 = 0.100*1004 – 0.999*1003 = 0.100*1004 – 0.0999*1004 =
0.100*1004 – 0.099*1004=0.001*1004 =10 (вместо ожидаемой 1, если проводилось усечение).

 

Особенности выполнения операций отношения (сравнения)

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

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

FLT_EPSILON = 1.192092896e-07F и

DBL_EPSILON = 2.2204460492503131e-016.

Примеры сравнения вещественных чисел на точное равенство:

int main()

{float x=1;

x+=0.5; // значение x 1.5 имеет тип float

bool b =(x==1.5); //константа 1.5 имеет тип double

// значение x и константа 1.5 представляются в 2 с/с точно, поэтому

cout << b << endl; // 1 (true)!!!

_getch();

return 0;

}

 

Int main()

int main()

{float x=1;

x+=0.1; // значение x 1.1 имеет тип float

bool b =(x==1.1); //константа 1.1 имеет тип double

// значение x и константа 1.1 представляются в 2 с/с бесконечным числом, поэтому

cout << b << endl; // 0 (false)!!!

_getch();

return 0;

}

НО!!!


Дата добавления: 2015-07-08; просмотров: 84 | Нарушение авторских прав


Читайте в этой же книге: Операции присваивания | Примеры использования | Логические выражения и примеры их записи | Пример 6. | Правила преобразования типов | Примеры преобразования типов | Адрес переменной | Программирование вычисления алгебраических выражений | Основные встроенные (стандартные) функции | Замечания по программированию алгебраических выражений |
<== предыдущая страница | следующая страница ==>
Операции умножения и деления| СВЕДЕНИЯ ПО ИЗУЧАЕМЫМ ВОПРОСАМ

mybiblioteka.su - 2015-2024 год. (0.007 сек.)