
ЛР 2
.docxМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно- вычислительных систем (КИБЭВС)
ВЕЩЕСТВЕННЫЕ ЧИСЛА. ОШИБКИ ПРИ РАБОТЕ С ВЕЩЕСТВЕННЫМИ ЧИСЛАМИ
Отчет по лабораторной работе №2
по дисциплине «Языки программирования»
Студент гр. 723-1
_______
__.__.2025
Преподаватель каф. КИБЭВС
_______А.В. Куртукова
__.__.2025
Введение
Цель работы – знакомство с основными ошибками, возникающими при обработке вещественных чисел.
Задание на лабораторную работу:
1. Изучить краткие теоретические сведения;
2. В качестве исходных значений принять следующие значения: x=<номер студенческого билета><номер группы>,<дата рождения ддммгггг>;
y=x*10-10;
c=x+y; c’= округление с до 9 знака после запятой;
z=x±10-8;
k=округл. до целого(х);
3. Произвести вычисления, и показать каким образом возникают ошибки при работе с вещественными числами. Все значения вычислять с максимальной точностью, не округляя. Относительную ошибку вычислять с точность до 10 значащих цифр;
4. Объяснить полученные результаты;
5. Для выбранного варианта задания изучить, какие типы данных есть в языке программирования, как они реализованы;
6. Написать программы, демонстрирующие ошибки вещественных чисел на языке программирования, соответствующего варианту;
7. Написать отчет и защитить у преподавателя.
РУЧНОЕ ВЫЧИСЛЕНИЕ
Согласно варианту задания были получены следующие значения чисел:
X =22720057231,13082004;
Y = X * 10-10 = 2,272005723113082004;
C = X + Y = 22720057233,402825763113082004;
C’ = 22720057233,402825763;
Z1 = X – 10-8 = 22720057231,13082003;
Z2 = X + 10-8 = 22720057231,13082005;
k = 22720057231;
Абсолютная ошибка: A = |C – C’| = 0,000000000113082004;
Относительная ошибка: O = A/C = 4,977188342366842501158964444565e-21
Предположим, что в младшем разряде X произошла ошибка, тогда: Z = X – 0,001 = 22 720 057 231,12982004.
Умножение без ошибки будет равным: m = X * X = 516 201 000 585 859 864 952,54053236287.
Умножение с ошибкой будет равным: n = X * Z = 516 201 000 585 837 144 895,30940154283..
При округлении X до целого числа абсолютная ошибка будет равна: A = |X – k| = 0,13082004.
Относительная ошибка будет равна: O = A/X = 5,7579097917390606950944394128716e-12.
Данные расчёты были получены с помощью калькулятора.
ПОДСЧЕТ С ПОМОЩЬЮ ПРОГРАММЫ
Для данной практической работы был выбран язык программирования С#, исходный код для программ указан в приложение А.
Результат работы программы представлен на рисунке 1.2.
Рисунок 2.1 – Результат работы программы
Появление ошибки значимости происходит по причине того, что система автоматически округляет значения до 5 знаков после запятой, из- за этого выводимые результаты абсолютной и относительной ошибок равны нулю и являются не верными. Также это связано с тем, что у каждого типа переменных есть свои ограничения и своя размерная сетка, которая напрямую зависит от типа данных.
Ошибка «Исчезновение операнда» происходит если один операнд относительно мал по отношению с другим операндом. Поэтому операнд 10-8 был потерян, так как для типа данных double он слишком мал. В тоже время для типа данных decimal отводится больше памяти для вещественных чисел, поэтому операнд b1 был представлен без потерь.
Ошибка «Умножение ошибки» возникает при увеличении абсолютной погрешности операнда. В данном случае за счет постоянного увеличения значений. Ошибка возникает из-за увеличения операндов на значение 0.1, при том что данное значение в вещественных числах не может быть представлено точно.
Ошибка «Потеря значимости» возникает при невозможности представить вычисления в допустимой форме. В данном случае, из-за того, что числа приблизительно равны друг другу. И как упоминалось ранее тип данных double имеет больше выделенной памяти для вещественных чисел нежели тип данных float и поэтому имеет меньшую ошибку.
Заключение
В ходе выполнения работы было осуществлено знакомство с основными ошибками, возникающими при обработке вещественных чисел.
Приложение А
(Обязательное)
Код программы
using System.IO.Compression;
namespace HelloWorld;
class Program
{
static void Main(string[] args)
{
double x = 22720057231.13082004;
double y = x * Math.Pow(10, -10);
double c = x + y;
double krug9 = Math.Round(c, 9);
double z = x + Math.Pow(10, -8);
double k = Math.Round(z);
double a = c - krug9;
Console.WriteLine("Абсолютная погрешность: " + a);
double r = a / c;
Console.WriteLine("Относительная погрешность: " + r);
System.Console.WriteLine();
System.Console.WriteLine("x = " + x);
System.Console.WriteLine("y = " + y);
System.Console.WriteLine("c = " + c);
System.Console.WriteLine("krug9 = " + krug9);
System.Console.WriteLine("z = " + z);
System.Console.WriteLine("k = " + k);
}
}
Томск 2025