- •Лабораторная работа №1 Линейные и разветвленные программы
- •Примеры использования арифметических операций
- •Примеры использования операций инкремента и декремента
- •Примеры использования операций отношения
- •Примеры использования поразрядных логических операций: Поразрядное логическое умножение:
- •Логический сдвиг:
- •Поразрядное логическое сложение:
- •Сложение по модулю 2 (исключающее или):
- •Примеры более сложного использования поразрядных логических операций:
- •Примеры записи логических выражений:
- •Алгебраические выражения
- •Пример вычисления значения выражения
- •Примеры использования преобразования типов
- •2. Особенности преобразования типов int и double:
- •6. Приведение типа в случае использования указателей:
- •7. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •9. Проанализируйте преобразование типов в операторах присваивания:
- •Особенности представления чисел по двоичному основанию
- •Особенности выполнения арифметических операций над вещественными числами
- •Операции умножения и деления
- •Ошибки округления
- •Переполнение (ошибка переполнения)
- •Потеря порядка (ошибка исчезновения порядка)
- •Катастрофическая потеря порядка (ошибка потери порядка)
- •Операции сложения и вычитания
- •Переполнение (ошибка переполнения)
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Правила работы с данными вещественных типов
- •Замечания по программированию алгебраических выражений
- •Условный оператор
- •Оператор switch Пример 1. Печать событий в зависимости от года
- •Пример 2. Распознавание вводимых символов
- •Пример 3. Печать сообщений о работе программы
- •Пример 4. Селектор перечислимого типа
9. Проанализируйте преобразование типов в операторах присваивания:
#include <stdio.h> #include <conio.h>
int main() {double d; float f; long l; short sh; sh = l= f = d = 100/3; //целое деление, т.к. числа без точки //присваивание выполняется справа налево printf (”f=%g\t”, (double)d); // 33 printf (”f=%g\t”, (double)f); // 33 printf (”l=%g\t”, (double)l); // 33 printf (”sh=%g\t\n”, (double)sh); // 33
d = f= l = sh = 100/3; //целое деление printf (”sh=%g\t”, (double)sh); // 33 printf (”l=%g\t”, (double)l); // 33 printf (”f=%g\t”, (double)f); // 33 printf (”f=%g\t\n”, (double)d); // 33
sh = l= f = d = 100/3.; //деление с плавающей точкой printf (”f=%g\t”, (double)d); // 33.333333 printf (”f=%g\t”, (double)f); // 33.333332 printf (”l=%g\t”, (double)l); // 33 printf (”sh=%g\t\n”, (double)sh); // 33
d = f= l = sh = (double)100/3; // деление с плавающей точкой ((...)100)/3 printf (”sh=%g\t”, (double)sh); // 33 printf (”l=%g\t”, (double)l); // 33 printf (”f=%g\t”, (double)f); // 33 printf (”f=%g\t\n”, (double)d); // 33
sh = l= f = d = (double)(100000/3); // целое деление printf (”f=%g\t”, (double)d); // 33333 printf (”f=%g\t”, (double)f); // 33333 printf (”l=%g\t”, (double)l); // 33333 printf (”sh=%g\t\n”, (double)sh); //число может не попасть в диапазон типа!!
d = f= l = sh = 100000/3; //целое деление printf (”sh=%g\t”, (double)sh); // 33333 присваивание выполняется первым printf (”l=%g\t”, (double)l); // число может не попасть в диапазон printf (”f=%g\t”, (double)f); // и все остальные присваивания будут неверны printf (”f=%g\t\n”, (double)d); _getch();
return 0;
}
Особенности представления чисел по двоичному основанию
Особенность представления чисел по двоичному (шестнадцатеричному) основанию – это невозможность осуществления точного перевода числа в заданную систему. Например, число 0.5 переводится в 2-ичную систему «точно»: 0.5 10 = 0.1 2 . Число 0.1 точного перевода не имеет и его значение определяется лишь заданной точностью (количеством получаемых цифр): 0.1 10 = 0.1FFF16 = 0.000111111111 2. Это формирует как бы первый уровень возможных ошибок в представлении числа.
Особенности выполнения арифметических операций над вещественными числами
Выполнение арифметических операций над вещественными числами на ограниченной разрядной сетке обусловливает появление при этом возможных ошибок. Эти особенности необходимо знать и при программировании избегать их. Вычисления над вещественными числами дают почти всегда неточный, а потому и неверный результат (насколько неверный – зависит от природы вычислений и точности представления вещественных чисел в данном типе компьютера).