- •Лекция 4 Операции и выражения
- •Понятие выражения и операции
- •Классификация операций
- •Приоритеты (ранги) операций
- •Арифметические операции
- •Примеры использования арифметических операций Выделение цифр в целом числе
- •Выделение цифр в вещественном числе
- •Арифметические операции над переменными символьного типа
- •Операции инкремента и декремента
- •Особенности выполнения операций инкремента и декремента
- •Операции присваивания
- •Примеры использования
- •Операции отношения
- •Логические операции
- •Особенности выполнения логических операций
- •Примеры использования логических операций
- •Логические выражения и примеры их записи
- •Поразрядные логические операции
- •Примеры выполнения поразрядных логических операций:
- •Операции поразрядного сдвига
- •Дополнительные операции Операции доступа к компонентам структурированного объекта
- •Операции доступа к адресуемым компонентам классов
- •Определение размера sizeof
- •Вызов функции ( )
- •Индексация [ ]
- •Операция запятая ,
- •Операция расширения области видимости ::
- •Преобразование типа
- •Правила преобразования типов
- •Примеры преобразования типов
- •2. Особенности преобразования типов int и double:
- •7. Проанализируйте преобразование типов в операторах присваивания:
- •8. Приведение типа в случае использования указателей:
- •9. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •10. С помощью приведения типа можно получить дробную часть числа:
- •Программирование вычисления алгебраических выражений
- •Определение первого символа вводимого значения
- •Контроль правильности ввода значения переменной
- •Основные встроенные (стандартные) функции
- •Пример вычисления по формуле
- •Замечания по программированию алгебраических выражений
- •Особенности представления чисел по двоичному основанию*
- •Особенности выполнения арифметических операций над вещественными числами*
- •Операции умножения и деления
- •Операции сложения и вычитания
- •Особые ситуации Ошибки округления
- •Ошибки переполнения
- •Потеря (исчезновение) порядка
- •Катастрофическая потеря порядка
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Обратить внимание
- •Правила работы с данными вещественных типов
Особенности выполнения арифметических операций над вещественными числами*
Выполнение арифметических операций над вещественными числами на ограниченной разрядной сетке также обусловливает появление возможных ошибок. Вычисления над вещественными числами дают почти всегда неточный, а потому и неверный результат (насколько неверный – зависит от природы вычислений и точности представления вещественных чисел в данном типе компьютера).
Операции умножения и деления
При умножении и делении вещественных чисел процессор выполняет следующие действия:
-
находит произведение (или частное от деления) мантисс
-
вычисляет сумму (разность) порядков операндов
-
нормализует мантиссу результата, если это необходимо
-
выполняет соответствующую корректировку порядка результата, если это необходимо.
Операции сложения и вычитания
При сложении и вычитании вещественных чисел процессор выполняет следующие действия:
-
выравнивание мантисс, т.е. сдвиг мантиссы числа с меньшим порядком на число разрядов, равное разности порядков
-
вычисляет сумму (разность) мантисс операндов
-
определяет порядок результата как больший из порядков операндов
-
нормализует мантиссу результата, если это необходимо
-
выполняет соответствующую корректировку порядка результата, если это необходимо.
Количество цифр в мантиссе – точность представления числа. Из-за ограниченности разрядов под представление мантиссы и порядка числа при умножении и делении, сложении и вычитании вещественных чисел, их сравнении на точное равенство возможно возникновение некоторых особых (исключительных) ситуаций, как последствий действий процессора:
-
ошибки округления – «выход» значения мантиссы за разрядную сетку (в случае произведения мантисса содержит больше разрядов, чем допустимо внутренним представлением данных соответствующего типа, поэтому часть младших разрядов произведения в память не записывается; при делении операция выполняется до получения нулевого промежуточного частного или до заполнения бит мантиссы результата);
-
ошибки переполнения – «выход» значения порядка за разрядную сетку;
-
машинный нуль – получение числа с ненулевой мантиссой и порядком меньшим, чем минимальный порядок в данном типе; иногда для характеристики такой ситуации употребляют выражение «обособленное представление 0»;
-
катастрофическая потеря порядка, к которой приводит в ряде случаев ситуация появления «машинного нуля»;
-
потеря значащих цифр.
Указанные особые ситуации нужно отслеживать и специально обрабатывать в программе.
Особые ситуации Ошибки округления
Пусть для представления вещественного числа выделено 3 разряда под мантиссу и 2 под порядок. Тогда при умножении двух чисел 0.123*1002 и 0.161*1005 имеем:
0.123*1002 * 0.161*1005 = 0.019803*1007 = 0.198*1006 = 198000 (вместо ожидаемого 198030), т.е. имеем ошибку округления.
Как следствие, надо помнить, что для вещественных чисел X и Y значения выражений X и X*Y/Y не равны. Например:
0.111*1000*0.223*1001/0.223*1001=0.025*1001/0.223*1001=0.25*1000/0.223*1001= 1.121*10-01 = 0.112*1000.
Ошибки переполнения
Пусть для представления вещественного числа выделено 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*10100 = 0.108*10** т.к. числа сначала приводятся к одинаковому – большему порядку, затем производится сложение мантисс и после этого повторная нормализация, при которой значение нового порядка 100 выходит за отведенные ему 2 разряда, т.е. имеем ошибку переполнения.
Тогда при умножении двух чисел 0.823*1046 и 0.101*1065 имеем:
0.823*1046 * 0.101*1065 = 0.83123*10** , т.к. значение порядка 111 выходит за отведенные ему 2 разряда, т.е. имеем ошибку переполнения.