Читайте также:
|
|
Пусть для представления вещественного числа выделено 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Операции умножения и деления | | | СВЕДЕНИЯ ПО ИЗУЧАЕМЫМ ВОПРОСАМ |