Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_1_метод_указания прога.doc
Скачиваний:
3
Добавлен:
03.11.2018
Размер:
301.57 Кб
Скачать

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

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

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

FLT_EPSILON = 1.192092896e-07F и

DBL_EPSILON = 2.2204460492503131e-016.

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

#include <conio.h>

#include <stdio.h>

int main()

{ float x=1;

x+=0.5;

bool b=(x==1.5); // дробная часть float x и double 1.5 представляются в 2 с/с конечным числом

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

_getch();

return 0;

}

#include <conio.h>

#include <stdio.h>

int main()

{ float x=1;

x+=0.1;

bool b=(x==1.1); // дробная часть float x и double 1.1 представляются в 2 с/с бесконечным числом

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

_getch();

return 0;

}

Правила работы с данными вещественных типов

  • при выполнении операций и вычислении значений функций действуют правила математики: нельзя выполнить деление на 0, извлечь корень из отрицательного числа, вычислить логарифм отрицательного числа и т.д.;

  • вычисления над вещественными числами дают почти всегда неверный результат: насколько неверный – зависит от природы вычислений;

  • вещественные числа редко бывают точно равны; из-за ограничения разрядов на мантиссу невозможно точное равенство двух величин; почти всегда имеют место погрешности округления; эти особенности необходимо знать и при программировании избегать их;

  • из–за фиксированного числа разрядов на мантиссу и порядок происходит ряд неприятностей; усечение – отбрасывание лишних цифр – плохо, округление – лучше; процессор всегда округляет значение;

  • ограничение разрядов порядка приводит к переполнению порядка, к отрицательному переполнению порядка или равенству его нулю.

  • количество цифр в мантиссе – точность представления; ненадежные цифры могут привести к серьезной потере точности;

  • добавление или вычитание малого (даже относительно малого) числа может никак не сказаться на результате (например, 1Е+15 и 1Е+10); необходимо перестроить формулу вычислений настолько, насколько это позволяет алгоритм или вводить общий масштаб;

  • при вычитании близких значений происходит потеря точности;

  • последовательность выполнения вычислений может повлиять на результат;

  • получение больших чисел может вызвать переполнение порядка, а очень малых – исчезновение числа (превращение в 0);

  • если один из операндов вещественный, а другой целый, то перед выполнением операции операнд целого типа приводится к вещественному типу; результат имеет вещественный тип;

  • если при выполнении арифметических операций с операндами вещественного типа получается значение, превосходящее максимально допустимое для этого типа, то происходит прерывание программы по переполнению;

  • форматированием вывода нужно пользоваться аккуратно, т.к. существует «эффект» форматирования вывода: при выводе вещественного числа происходит «усечение» с округлением дробной части до указанного числа позиций, поэтому можно увидеть «неправильные» результаты: например, значение 1.0000000000Е-10 при выводе в формате: 10:5 дает 0.00000.