- •Лабораторная работа №1 Линейные и разветвленные программы
- •Примеры использования арифметических операций
- •Примеры использования операций инкремента и декремента
- •Примеры использования операций отношения
- •Примеры использования поразрядных логических операций: Поразрядное логическое умножение:
- •Логический сдвиг:
- •Поразрядное логическое сложение:
- •Сложение по модулю 2 (исключающее или):
- •Примеры более сложного использования поразрядных логических операций:
- •Примеры записи логических выражений:
- •Алгебраические выражения
- •Пример вычисления значения выражения
- •Примеры использования преобразования типов
- •2. Особенности преобразования типов int и double:
- •6. Приведение типа в случае использования указателей:
- •7. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •9. Проанализируйте преобразование типов в операторах присваивания:
- •Особенности представления чисел по двоичному основанию
- •Особенности выполнения арифметических операций над вещественными числами
- •Операции умножения и деления
- •Ошибки округления
- •Переполнение (ошибка переполнения)
- •Потеря порядка (ошибка исчезновения порядка)
- •Катастрофическая потеря порядка (ошибка потери порядка)
- •Операции сложения и вычитания
- •Переполнение (ошибка переполнения)
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Правила работы с данными вещественных типов
- •Замечания по программированию алгебраических выражений
- •Условный оператор
- •Оператор switch Пример 1. Печать событий в зависимости от года
- •Пример 2. Распознавание вводимых символов
- •Пример 3. Печать сообщений о работе программы
- •Пример 4. Селектор перечислимого типа
Особенности выполнения операций отношения (сравнения)
Количество цифр в мантиссе – точность представления числа. Из–за фиксированного количества разрядов на мантиссу и порядок происходит ряд неприятностей. Одна из них – невозможность точного равенства двух величин. Два вещественных числа редко бывают точно равны. При работе с вещественными числами следует избегать проверки их на равенство. Обратите внимание, что необходимо не напрямую сравнивать эти числа, а произвести вычитание их по модулю и сравнивать эту разность с некоторым, наперед заданным, малым числом.
Это связано с погрешностью представления вещественных значений в памяти. Значение величины, с которой сравнивается модуль разности, следует выбирать в зависимости от решаемой задачи и точности переменных, участвующих в выражении. Снизу эта величина ограничена константами, определенными в заголовочном файле <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.