ЛР-2 / ЯП №2
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР) Кафедра безопасности информационных систем (БИС)
ВЕЩЕСТВЕННЫЕ ЧИСЛА. ОШИБКИ ПРИ РАБОТЕ С ВЕЩЕСТВЕННЫМИ ЧИСЛАМИ Отчет по лабораторной работе №2
по дисциплине «Языки программирования»
Студент гр.
_______
_______
Принял:
Доцент каф. КИБЭВС, д.т.н., доцент
_______ Романов А. С.
_______
Томск 2026
|
Оглавление |
Введение............................................................................................................. |
3 |
Ход работы......................................................................................................... |
4 |
Заключение...................................................................................................... |
12 |
Приложение А................................................................................................. |
13 |
2
Введение
Целью работы является знакомство с основными ошибками, возникающими при обработке вещественных чисел.
Для выполнения работы был выбран ЯП Python. Задание:
1.Изучить теоретические сведения.
2.В качестве исходных значений принять следующие значения:
x = <номер студенческого билета><номер группы>,<дата рождения ддммгггг>;
y = x * 10-10; c = x + y;
c’ = округление с до 9 знака после запятой; z = x ± 10-8 ;
k = округлить до целого(х).
Произвести вычисления, и показать каким образом возникают ошибки при работе с вещественными числами. Все значения вычислять с максимальной точностью, не округляя. Относительную ошибку вычислять с точность до 10 значащих цифр.
3.Объяснить полученные результаты.
4.Для выбранного варианта задания изучить, какие типы данных есть в языке программирования, как они реализованы.
5.Написать программы, демонстрирующие ошибки вещественных
чисел.
6.Написать отчет и защитить у преподавателя.
3
1 Ход работы
Ниже приведены точные расчеты чисел: x = 24730187341,24022006;
y = x*10-10 = 2,473018734124022006;
c = x+y = 24730187343,713238794124022006; c’ = 24730187343,713238794;
z1 = x+10-8 = 24730187341,24022007;
z2 = x-10-8 = 24730187341,24022005; k = 24730187341.
Существуют три основные ошибки вычислений, возникающие при выполнении операции над вещественными числами:
1.Исчезновение операнда – операнд может исчезнуть, если он относительно мал по отношению с другим операндом. В данной работе можно увидеть данную ошибку при вычислении чисел z1 и z2.
2.Умножение ошибки – многократное увеличение абсолютной погрешности операнда, которая может появиться при использовании арифметики с плавающей точкой, даже если относительная ошибка мала. Зачастую это является результатом умножения или деления. Данная ошибка наблюдается при вычислении y.
3.Потеря значимости – полная потеря значимости, вызванная вычитанием почти равных чисел.
В ходе работы было запрограммировано значения из задания (рисунок 1.1), а также получены результаты вычислений (рисунок 1.2).
4
Рисунок 1.1 — Запрограммированная последовательность вычислений
Рисунок 1.2 — Результаты вычислений на ЯП Python
При вычислении числа «x», с помощью программы мы получили x = 24730187341,24021912. Следовательно, можно сделать вывод, что абсолютная ошибка при расчете равна 0,00000094, а относительная ошибка равна 0,000000000000000380102.
При вычислении числа «y» получили y = 2,473018734124022178, из чего можно сделать вывод, что абсолютная ошибка равна 0,000000000000000172, а относительная – 0,0000000000000000695508.
5
Во время расчета числа «c» получили c = 24730187343,713237762451171875. В данной ситуации абсолютная ошибка равна 0,000001031672850131, а относительная 0,00000000000000004172. При округлении числа c до 9 знаков после запятой получилось c’ = 24730187343,713237762. Это означает, что абсолютная ошибка равна 0,000001032, а относительная – 0,0000000000000000417298.
Числа «z1» и «z2» получились равными 24730187341.240219116210938. Следовательно, абсолютная ошибка равна 0.000000953789062 и 0,000000933789062 соответственно, а относительная ошибка равна 0.000000000000000038565 и 0.000000000000000037755 соответственно.
При округлении числа до целого ошибки отсутствуют.
Также по заданию были разобраны примеры и приведены коды их решения на ЯП Python (рисунок 1.3-1.14)
Рисунок 1.3 — Код для ошибки Исчезновение операнда
Рисунок 1.4 — Вывод для кода ошибки 1
Видно, что значения совпадают, следовательно сложение и вычитание 10-8 не дает ничего, операнд пропадает.
6
Рисунок 1.5 — Код для ошибки Умножение ошибки
Рисунок 1.6 — Вывод для кода ошибки 2
Видно, что при изменении числа на очень малую величину, их квадраты отличаются.
Рисунок 1.7 — Код для ошибки Потеря значимости
7
Рисунок 1.8 — Вывод для кода ошибки 3
При изменении числа на одну величину, а затем вычитания исходного числа, получается так, что число на которое увеличили изменяется.
Рисунок 1.9 — Код для Программный вывод битов (IEEE 754)
8
Рисунок 1.10 — Вывод для Программный вывод битов (IEEE 754)
Судя по битам, даже малейшее изменение исходного числа, приводит к огромным различиям в битах.
Рисунок 1.11 — Код для Определение машинного эпсилона
Рисунок 1.12 — Вывод для Определение машинного эпсилона
9
Как видно из вывода, было реализовано определение машинного эпсилона и судя по тому что значение совпало с ulp из math, реализовано верно.
Рисунок 1.13 — Код для Метода Кахана
Рисунок 1.14 — Вывод для Метода Кахана
Как можно видеть, точная сумма находится верно, тогда как обычная имеет ошибку.
10
