
Министерство образования и науки РФ
Томский Государственный университет систем управления и радиоэлектроники (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
ОТЧЕТ
по лабораторной работе №2
Тема: “Вещественные числа. Ошибки при работе с вещественными числами”
Выполнил студент гр. 521
Ингинен А. И.
______________ 08.12.12
Принял: Романов А. С.
______________ 24.12.12
Томск 2012
-
Цель работы
Цель работы: знакомство с основными ошибками, возникающими при обработке вещественных чисел.
-
Задание
-
Изучить теоретические сведения.
-
В качестве исходных значений принять следующие значения:
x=<номер студенческого билета>,<номер группы>,<дата рождения ддммгг>;
y=x*10-10;
c=x+y;
c’=округление с до 9 знака после запятой;
z=x±10-8;
k=округление до целого(x).
-
Произвести вычисления. Все значения вычислять с максимальной точностью, не округляя. Относительную ошибку вычислять с точностью до 10 значащих цифр.
-
Объяснить полученные результаты.
-
Написать программу, демонстрирующую ошибки вещественных чисел на одном из неизученных языков программирования.
-
Написать отчет и защитить у преподавателя.
-
Теоретический материал
Вещественные числа при обработке в вычислительной системе представляются в двоичном виде. Существуют два подхода:
-
Число представляется согласно двоичной арифметике в виде числа с плавающей запятой. Такой подход называется двоично-кодированным десятичным числом.
-
Цифры числа кодируются как целое число, дополненное информацией о позиции десятичного разделителя. Этот формат числа называется форматом с фиксированной точкой.
Существуют три основные ошибки вычислений, возникающие при вычислении операции над вещественными числами:
-
Исчезновение операнда. Операнд может исчезнуть, если он относительно мал по отношению к другому операнду.
-
Умножение ошибки – многократное увеличение абсолютной погрешности операнда.
-
Потеря значимости. Возникает, когда результат вычислений невозможно представить в допустимой форме.
-
Ход выполнения работы
x=1152008521,29061994;
y= 0,115200852129061994;
c=x+y=1152008521,405820792129061994;
c’=1152008521,405820792;
абсолютная ошибка: A=|c-c’|=0,000000000129061994;
относительная ошибка: O=A/c=0,0000000000000000001120321521.
Предполагаем, что в младшем разряде числа x произошла ошибка.
z=x+0,00000001=1152008521,29061995.
Произведем умножение без ошибок.
m=x*x=1327123633126200735,5894774295256;
Произведем умножение с ошибкой.
n=x*z=1327123633126200747,1095626424318;
абсолютная ошибка: A=|m-n|=11,5200852129062;
относительная ошибка: O=A/m=0,000000000000000008680491346.
Округлим x до целого числа.
k=1152008521;
абсолютная ошибка: A=|x-k|=0,29061994;
относительная ошибка: O=A/x=0,0000000002522723874.
Программа (Java):
import java.math.BigDecimal;
import java.math.RoundingMode;
public class lab1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
{ double x, y, c, c1, a, o ;
x=1152008521.29061994;
double x1=Math.pow(10,-10);
y=x*x1;
c=x+y;
c1 = new BigDecimal(c).setScale(9, RoundingMode.HALF_UP).doubleValue();
a=Math.abs(c-c1);
o=a/c;
double z=x+0.00000001;
double m=x*x;
double n=x*z;
double a1=Math.abs(m-n);
double o1=a1/m;
int j = (int) Math.round(x);
double k = (double)j;
double a2=Math.abs(x-k);
double o2=a2/x;
System.out.println("x=" + x);
System.out.println("y=" + y);
System.out.println("c=" + c);
System.out.println("c'=" + c1);
System.out.println("A=" + a);
System.out.println("O=" + o);
System.out.println("z=" + z);
System.out.println("m=" + m);
System.out.println("n=" + n);
System.out.println("A=" +a1);
System.out.println("O=" +o1);
System.out.println("k=" + k);
System.out.println("A=" +a2);
System.out.println("O=" +o2);
}
}
}
Результат работы программы:
x=1.1520085212906199E9
y=0.11520085212906199
c=1.1520085214058206E9
c'=1.1520085214058206E9
A=0.0
O=0.0
z=1.1520085212906199E9
m=1.32712363312620058E18
n=1.32712363312620058E18
A=0.0
O=0.0
k=1.152008521E9
A=0.2906198501586914
O=2.5227230943839177E-10
-
Вывод
В ходе выполнения лабораторной работы я познакомилась с основными ошибками, возникающими при обработке вещественных чисел.