Лабораторная работа(1)
.DOCCанкт-Петербургский Государственный Электротехнический Университет.
КАФЕДРА ИИТ
Отчет по лабораторной работе № 1
Изучение особенностей вычисления с плавающей точкой
Преподаватель : Титов М.С.
Студенты : Виноградов К.Ю.
Евдокимов С. Н.
Санкт-Петербург
Цель работы:
Изучение особенностей вычислений с плавающей точкой.
Числа с плавающей точкой являются машинным представлением системы действительных чисел. На множестве чисел с плавающей точкой определены плавающие арифметические операции, однако не все законы обычной арифметики выполняются для системы чисел с плавающей точкой. Так, например, для нее не справедливы ассоциативный и коммутативный законы. Предлагается с использованием ряда специально разработанных программ выполнить исследование плавающей арифметики. В частности, построить множество чисел с плавающей точкой и проанализировать их распределение на действительной оси, вычислить машинный эпсилон, характеризующий точность вашего компьютера, вычислить сумму ряда, состоящего из одинаковых чисел, а также проанализировать ошибки округления при вычислениях с плавающей точкой.
1. Программа формирует множество чисел F с плавающей точкой.
Каждое число с плавающей точкой, принадлежащее F, имеет вид :
x=±( d1 /b+d2 /b2+...+dt /bt )*bn , где целые числа d1 ,..., dt удовлетворяют неравенствам:
0£ di £b-1, (i=1,...,t ), и -N £ n £ N , N=2( m-1 ).
Здесь b - основание , t - разрядность мантиссы , m - разрядность порядка, - параметры , характеризующие множество F .
Задание :
исследовать распределение нормализованных чисел с плавающей точкой на вещественной оси для различных значений параметров b, t, m .
Введенные значения :
b=2 ; t=2 ; m=2 b=2 ; t=1 ; m=3 b=2 ; t=3 ; m=1
x[0] =0.000000 x[0] =0.000000 x[ 0]=0.000000
x[1] =0.062500 x[1] =0.003906 x[ 1]=0.250000
x[2] =0.093750 x[2] =0.007812 x[ 2]=0.312500
x[3] =0.125000 x[3] =0.015625 x[ 3]=0.375000
x[4] =0.187500 x[4] =0.031250 x[ 4]=0.437500
x[5] =0.250000 x[5] =0.062500 x[ 5]=0.500000
x[6] =0.375000 x[6] =0.125000 x[ 6]=0.625000
x[7] =0.500000 x[7] =0.250000 x[ 7]=0.750000
x[8] =0.750000 x[8] =0.500000 x[ 8]=0.875000
x[9] =1.000000 x[9] =1.000000 x[ 9]=1.000000
x[10]=1.500000 x[10]=2.000000 x[10]=1.250000
x[11]=2.000000 x[11]=4.000000 x[11]=1.500000
x[12]=3.000000 x[12]=8.000000 x[12]=1.750000
x[13]=4.000000 x[13]=16.00000
x[14]=6.000000 x[14]=32.00000
x[15]=64.00000
Вывод :
- распределение чисел с плавающей запятой на вещественной оси неравномерно. Плотность распределения максимальна при малых значениях чисел и минимальна при приближении к границе диапазона.
2. Точность плавающей арифметики характеризуется посредством машинного эпсилон, т. е. наименьшего числа eps с плавающей точкой такого , что 1+eps>1.
Предлагаемая программа вычисляет величину eps(c) для произвольного значения константы, так что c+eps(c)>c.
Задание :
вычислить значения eps(c) для различных значений с, построить график этой зависимости и обьяснить полученные результаты.
Получены результаты :
c=2 c=4
i= 62 eps=0.00000000000000000021 i= 61 eps=0.00000000000000000043
c=5 c=10
i= 61 eps=0.00000000000000000043 i= 60 eps=0.00000000000000000086
c=100 c=1000
i= 57 eps=0.00000000000000000693 i= 54 eps=0.00000000000000005551
c=10000 c=30000
i= 50 eps=0.00000000000000088817 i= 49 eps=0.00000000000000177635
Вывод :
-
При небольших значениях с эпсилон очень мало. С увеличением с увеличивается и эпсилон, причем эпсилон растет по геометрической прогрессии, с каждым шагом увеличиваясь ровно в два раза
Таким образом, получаем график зависимости эпсилон от с:
3. Программа демонстрирует особенности аппроксимации действительных чисел в ЭВМ при их представлении в форме чисел с плавающей точкой. Предлагается вычислить сумму N чисел вида 1/N и оценить величину абсолютной и относительной ошибок, возникающих вследствии округления.
Вводится единственный параметр N типа int , при этом если N>0 , то вычисляется сумма x[i]=x[i-1]+1/N , i=1,2,...,N, x[0]=1.0 .
В загаловках приняты обозначения : x - число тиап float, dx - число типа double .
Задание :
исследовать абсолютные (x-dx) и относительные (x-dx)/dx ошибки округления при вычислениях с плавающей точкой сумм чисел при различных значениях шага суммирования.
Введенныое значение :
N |
x-dx |
x-dx/dx |
2 |
0.0000000000 |
0.000000% |
4 |
0.0000000000 |
0.000000% |
8 |
0.0000000000 |
0.000000% |
15 |
0.0000000596 |
0.000006% |
20 |
0.0000000596 |
0.000006% |
25 |
0.0000000224 |
0.000002% |
30 |
0.0000000596 |
0.000006% |
50 |
0.0000000224 |
0.000002 % |
100 |
0.0000000224 |
0.000002 % |
200 |
0.0000000224 |
0.000002 % |
500 |
0.0000000689 |
0.000007 % |
1000 |
0.0000000689 |
0.000007 % |
5000 |
0.0000000253 |
0.000003 % |
Вывод :
В ходе же суммирования с каждым шагом увеличивалась лишь абсолютная ошибка, то-есть происходило ее накопление, связанное с тем, что числа часто не могут быть представлены абсолютно точно. Относительная ошибка не менялась, что говорит о равномерном накоплении ошибки в ходе суммирования на отрезке [0; 1] для каждого N.
4. Программа демонстрирует проявление ошибок округления, возникающих при вычислении показательной функции exp(x) для чисел с плавающей точкой для двух вариантов алгоритма вычислений. Вычисляется значение функции exp(x) в виде суммы ряда :
exp(x)=1+x+x2 /2!+...+xN /N!
Потеря точности возникает при больших абсолютных значениях аргумента. Число членов ряда N выбирается из условия : xN/ N!< eps
Результаты алгоритма сравниваются с соответствующими результатами, полученными с использованием улучшенного алгоритма, в котором число x разлагается на целую и дробную часть : x=m+f , exp(x)=exp(m)*exp(f);
Задание :
исследовать проявление ошибок округления, а также скорость сходимости обоих алгоритмов.
Введенное значение аргумента x :
Введенное значение аргумента x:2
Введенное значение точности eps:0.001
Разложение Тейлора
i= 10 s= 7.388994708994709
Улучшенный алгоритм
i= 1 s= 7.389056098930649
Абс.погр.= 0.000061389935940
Отн.погр.=0.000831%
Введенное значение аргумента x:2
Введеннон значение точности eps:0.00001
Разложение Тейлора
i= 12 s= 7.389054566832344
Улучшенный алгоритм
i= 1 s= 7.389056098930649
Абс.погр.= 0.000001532098304
Отн.погр.=0.000021%
Введенное значение аргумента x:10
Введенное значение точности eps:0.01
Разложение Тейлора
i= 30 s= 22026.464036258916200
Улучшенный алгоритм
i= 1 s= 22026.465794806703300
Абс.погр.= 0.001758547787176
Отн.погр.=0.000008%
Введенное значение аргумента x:50
Введенное значение точности eps:0.01
Разложение Тейлора
i=138 s=5184705528587072000000.0000000000000
Улучшенный алгоритм
i= 1 s=5184705528587058400000.0000000000000
Абс.погр.= 13631488.000000000000000
Отн.погр.=0.000000%
Вывод :
При увеличении аргумента абсолютная погрешность возрастает , но несмотря на это относительная погрешность очень мала и при больших значениях x выходит за пределы машинного эпсилон и не может быть подсчитана. Поэтому такой способ вычисления exp(x) применим лишь в том случае, когда нам надо получить представление о ее поведении.Сходимость ряда Тейлора по стандартному алгоритму не дает требуемых результатов по скорости вычисления. Так, уже для х = 10 при точности порядка 1Е-2 требуется 30 итераций, каждая из которых по объему вычислений превышает предыдущую. То-есть разложение в ряд Тейлора является зависимым от величины аргумента. Поэтому более рациональным методом является улучшенный алгоритм, который для целых чисел дает сходимость в 1 шаг, а количество остальных итераций зависит уже только от требуемой точности.