Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР-2 / ЯП №2

.pdf
Скачиваний:
1
Добавлен:
15.05.2026
Размер:
404.67 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР) Кафедра безопасности информационных систем (БИС)

ВЕЩЕСТВЕННЫЕ ЧИСЛА. ОШИБКИ ПРИ РАБОТЕ С ВЕЩЕСТВЕННЫМИ ЧИСЛАМИ Отчет по лабораторной работе №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

Соседние файлы в папке ЛР-2