ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 27.03.2024
Просмотров: 9
Скачиваний: 0
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
Вещественные числа. Ошибки при работе с вещественными числами
Отчет по лабораторной работе №2 по дисциплине «Языки программирования»
|
|
Студент гр. ***-* |
|
|
|
|
|
________.2023 |
|
|
Принял |
|
|
Кандидат Технических наук, Доцент каф. КИБЭВС |
|
__________ |
________ А.С. Романов |
|
|
________.2023 |
2023
Введение
Цель работы: знакомство с основными ошибками, возникающими при обработке вещественных чисел.
Задание:
1. Изучить теоретические сведения.
2. В качестве исходных значений принять следующие значения:
x= <номер студенческого билета> <номер группы>, <дата рождения ддммггг>;
y=x*10-10;
c=x+y;
c’= округление с до 9 знака после запятой;
z=x±10-8;
k=округлить до целого(х).
3. Произвести вычисления, и показать каким образом возникают ошибки при работе с вещественными числами. Все значения вычислять с максимальной точностью, не округляя. Относительную ошибку вычислять с точность до 10 значащих цифр.
4. Объяснить полученные результаты.
5. Для выбранного варианта задания изучить, какие типы данных есть в языке программирования, как они реализованы.
6. Написать программы, демонстрирующие ошибки вещественных чисел на языке программирования, соответствующего варианту.
7. Написать отчет и защитить у преподавателя.
Работа была выполнена, основываясь на языке программирования Python.
2 Ход работы
2.1 Расчеты точных чисел
Ниже приведены точные расчеты чисел:
x = 21710457112,28112002
y = 2,171045711228112002
c = 21710457114,452167510986
c’ = 21710457114,452167511
z1 = 21710457142б2811203003
z2 = 21710457142б2811203003
k = 21719457112
2.2 Описание возможных ошибок
Существуют три основные ошибки вычислений, возникающие при выполнении операции над вещественными числами:
-
Исчезновение операнда – операнд может исчезнуть, если он относительно мал по отношению с другим операндом. В данной работе можно увидеть данную ошибку при вычислении чисел z1 и z2.
-
Умножение ошибки – многократное увеличение абсолютной погрешности операнда, которая может появиться при использовании арифметики с плавающей точкой, даже если относительная ошибка мала. Зачастую это является результатом умножения или деления. Данная ошибка наблюдается при вычислении y.
-
Потеря значимости – полная потеря значимости, вызванная вычитанием почти равных чисел.
2.3 Вычисление чисел с помощью программы
При вычислении числа «x», с помощью программы мы получили x = 21710457112,28112002. Следовательно, можно сделать вывод, что абсолютная ошибка при расчете равна 0,00000002, а относительная ошибка равна 0.000000000000000000921215.
При вычислении числа «y» получили y = 2.1710457112, из чего можно сделать вывод, что абсолютная ошибка равна 0.457112281120020003, а относительная – 0.210549358199114911016636.
Во время расчета числа «c» получили c = 21710457114.452167510986. В данной ситуации абсолютная ошибка равна 0.00009573122811200, а абсолютная – 0.0000000000000044094524407. При округлении числа c до 9 знаков после запятой получилось c = 21710457114.452167511. Это означает, что абсолютная ошибка равна 0.000067511, а относительная – 0.00000000000000311.
Числа «z1» и «z2» получились равными 21710457112.2811203003. Следовательно, абсолютная ошибка равна 0.00002003 и 0.00002001 соответственно, а относительная ошибка равна 0.00000000000000092 соответственно.
При округлении числа до целого ошибки отсутствуют.
На рисунке 2.1 представлен вывод программы
Рисунок 2.1 – Вывод при работе программы
2.4 Типы данных в языке Python
Всего в языке программирования Python есть 8 типов данных:
-
int – целые числа;
-
float – числа с плавающей точкой;
-
complex – комплексные числа (числа вида a + b*i, где a и b – вещественные числа, а i – мнимая единица, т.е. число для которого выполняется i^2 = -1);
-
string – строки;
-
list – списки;
-
tuple – кортежи;
-
dict – словари;
-
file – файлы.
В данной работе использовался тип данных float, который отвечает за числа с плавающей точкой. Переменная такого типа может принимать значения от 2.2^-308 до 1.7^308. Переменные типа int как и в других языках могут принимать значения от -2 147 483 648 до 2 147 483 648.
Приложение А
Листинг программы
def toFixed(numObj, digits=0): return f"{numObj:.{digits}f}" x = 21710457112.28112002; A1 = 0.00000002 print("x =", toFixed(x, 10), "\nАбсолютная ошибка =", toFixed(A1, 8), "\nОтносительная ошибка =", toFixed(A1 / x, 24)) y = x * (10 ** (-10)); A2 = 0.45711228112002 print("y =", toFixed(y, 10), "\nАбсолютная ошибка =", toFixed(A2, 18), "\nОтносительная ошибка =", toFixed(A2 / y, 24)) c = x + y; A3 = 0.000095731228112002 print("c =", toFixed(c, 12), "\nАбсолютная ошибка =", toFixed(A3, 18), "\nОтносительная ошибка =", toFixed(A3 / (y + x), 25)) c1 = toFixed(c, 9); A4 = 0.000067511 print("c1 =", c1, "\nАбсолютная ошибка =", toFixed(A4, 9), "\nОтносительная ошибка =", toFixed(0.00000000000000311, 17)) z1 = x + 10 ** (-8); A5 = 0.00002003 print("z1 =", toFixed(z1, 10), "\nАбсолютная ошибка =", toFixed(A5, 8), "\nОтносительная ошибка =", toFixed(A5 / z1, 17)) z2 = x - 10 ** (-8); A6 = 0.00002001 print("z2 =", toFixed(z2, 10), "\nАбсолютная ошибка =", toFixed(A6, 8), "\nОтносительная ошибка =", toFixed(A6 / z2, 17)) k = int(x) print("k =",k,"\nАбсолютная ошибка =", 0, "\nОтносительная ошибка =", 0)