- •Лабораторная работа №1 Линейные и разветвленные программы
- •Примеры использования арифметических операций
- •Примеры использования операций инкремента и декремента
- •Примеры использования операций отношения
- •Примеры использования поразрядных логических операций: Поразрядное логическое умножение:
- •Логический сдвиг:
- •Поразрядное логическое сложение:
- •Сложение по модулю 2 (исключающее или):
- •Примеры более сложного использования поразрядных логических операций:
- •Примеры записи логических выражений:
- •Алгебраические выражения
- •Пример вычисления значения выражения
- •Примеры использования преобразования типов
- •2. Особенности преобразования типов int и double:
- •6. Приведение типа в случае использования указателей:
- •7. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •9. Проанализируйте преобразование типов в операторах присваивания:
- •Особенности представления чисел по двоичному основанию
- •Особенности выполнения арифметических операций над вещественными числами
- •Операции умножения и деления
- •Ошибки округления
- •Переполнение (ошибка переполнения)
- •Потеря порядка (ошибка исчезновения порядка)
- •Катастрофическая потеря порядка (ошибка потери порядка)
- •Операции сложения и вычитания
- •Переполнение (ошибка переполнения)
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Правила работы с данными вещественных типов
- •Замечания по программированию алгебраических выражений
- •Условный оператор
- •Оператор switch Пример 1. Печать событий в зависимости от года
- •Пример 2. Распознавание вводимых символов
- •Пример 3. Печать сообщений о работе программы
- •Пример 4. Селектор перечислимого типа
Операции умножения и деления
При умножении и делении вещественных чисел процессор выполняет следующие действия:
-
находит произведение (или частное от деления) мантисс
-
вычисляет сумму (разность) порядков операндов
-
нормализует мантиссу результата, если это необходимо
-
выполняет соответствующую корректировку порядка результата, если это необходимо.
При этом возможно возникновение некоторых «особых» ситуаций, как последствий действий процессора.
Ошибки округления
Из-за ограниченности разрядов под представление мантиссы при выполнении операций умножения и деления возможен «выход» значения мантиссы за разрядную сетку (в случае произведения мантисса содержит больше разрядов, чем допустимо внутренним представлением данных соответствующего типа, поэтому часть младших разрядов произведения в память не записывается; при делении операция выполняется до получения нулевого промежуточного частного или до заполнения бит мантиссы результата). Например, пусть для представления вещественного числа выделено 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.
#include <conio.h>
#include <stdio.h>
int main()
{float a,b;
b=2.0e20 + 1.0;
a=b-2.0e20;
printf ("%f\n", a);
b=2.0e4 + 1.0;
a=b-2.0e4;
printf ("%f\n", a);
_getch();
return 0;
}
Результат:
4008175468544.000000
1.000000
#include <conio.h>
#include <stdio.h>
int main()
{double a,b;
b=2.0e20 + 1.0;
a=b-2.0e20;
printf ("%f\n", a);
b=2.0e4 + 1.0;
a=b-2.0e4;
printf ("%f\n", a);
_getch();
return 0;
}
Результат:
0.000000
1.000000
Переполнение (ошибка переполнения)
Пусть для представления вещественного числа также выделено 3 двоичных разряда под мантиссу и 2 – под порядок. Тогда при умножении двух чисел 0.823*1046 и 0.101*1065 имеем:
0.823*1046 * 0.101*1065 = 0.83123*10** , т.к. значение порядка 111 выходит за отведенные ему 2 разряда, т.е. имеем ошибку переполнения.
Потеря порядка (ошибка исчезновения порядка)
При выполнении операций умножения и деления вещественных чисел из-за ограниченности разрядов под представление мантиссы и порядка числа может возникнуть ситуация появления «машинного нуля». «Машинный нуль» - это число с ненулевой мантиссой и порядком меньшим, чем минимальный порядок в данном типе. Иногда для характеристики данной ситуации употребляют выражение «0 в случае выполнения арифметических операций над вещественными числами представляется обособленно». Например, пусть для представления вещественного числа выделено 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) будут восприниматься как «машинный нуль» – это и есть ошибка исчезновения (потери) порядка.