Виконання роботи
Завдання:
50 |
(| 7x/9 | 1) |
x]-1.,1[ x= 0.06
|
Згідно поставленого завдання, аналітичний вид математичної функцій, що буде обчислюватися, буде мати вигляд( для наочності обчислень беремо 5 членів ряду):
На основі отриманого виразу обчислюємо еталонне значення функції на проміжку зміни х, fe(x).
Обчислені значення fe заносимо у відповідний стовпець Таблиці 1.
Мінімальне обчислене значення fe рівне -1,24184, а максимальне 0,58641. Для обчислення значення функції f8 та f16 потрібно виконати узгодження з розрядністю обчислених коефіцієнтів, змінної х та результату.
Приведення коефіцієнтів та змінної х до формату з фіксованою комою довжиною 8 біт( для f8). Згідно завдання х міняється в межах -1..1 а згідно обчислення, коливається в межах -1.5..0,57. Отже для представлення х, коефіцієнтів та результату потрібно вибрати кількість розрядів для цілої частини та дробової частини з врахуванням того що їх загальна кількість 8. Оскільки в нас результат є знаковим і , ціла частина змінної х коливається від 0 до 1 (0 до 1). Таким чином для кодування цілої частини змінної х необхідно 1 двійковий розряд і один розряд для кодування даних. Отже для дробової частини залишається 6 розрядів.
Приведення коефіцієнтів та змінної х до формату з фіксованою комою довжиною 16 біт( для f16). Згідно завдання х міняється в межах -1..1 а згідно обчислення, коливається в межах -1.5..0,57. Отже для представлення х, коефіцієнтів та результату потрібно вибрати кількість розрядів для цілої частини та дробової частини з врахуванням того що їх загальна кількість 16. Оскільки в нас результат є знаковим і , ціла частина змінної х коливається від 0 до 1 (0 до 1). Таким чином для кодування цілої частини змінної х необхідно 1 двійковий розряд і один розряд для кодування даних. Отже для дробової частини залишається 14 розрядів.
При використанні типів даних з рухомою комою не виникає проблеми з представленням чисел з великою кількістю чисел після коми( довгої дробової частини). При використанні форматів з фіксованою комою необхідно виконати переведення з числа у фіксований формат.
Після обчислення всіх значень fe f8 f16 виконуємо обчислення абсолютної та відносної похибки проведених обчислень для всіх значень х з заданого діапазону .
На основі проведених розрахунків похибок виводимо відповідні графіки.
Таблиця 1. Результати роботи.
Лістинг програми:
using System;
class lab1_dcpsi
{
static double DecToBin(double a, int n)
{
int n_int = 0, k = 0, i = 0;
double res = 0, spow = 0;
bool fsign;
if (a < 0)
fsign = true;
else
fsign = false;
a = Math.Abs(a);
if (a >= 1)
{
n_int = 1;
a -= 1;
}
for (i = 0; i < n; i++)
{
k = (int)(a * 2);
a = a * 2 - k;
spow = 1 / Math.Pow(2.0, i + 1);
res += k * spow;
}
res += n_int;
if(fsign == true)
res *= (-1);
return res;
}
static void Main()
{
const double koef1 = 0.500;
const double koef2 = 0.3333333;
const double koef3 = 0.250;
const double koef4 = 0.200;
const double koef0 = 0.7777777;
double x = 0,
x_1 = 0,
x_2 = 0, x_2vkoef1 = 0, TFp0 = 0, delta_8, Fe,
x_3 = 0, x_3vkoef2 = 0, TFp1 = 0, delta_16, Fp8,
x_4 = 0, x_4vkoef3 = 0, TFp2 = 0, eps_8, Fp16,
x_5 = 0, x_5vkoef4 = 0, TFp3 = 0, eps_16;
double cnt = -0.94, dx = 0.06;
int prc_8 = 6,
prc_16 = 14;
Console.WriteLine("x\tFet\tF16\tFp8\tdelta16\tdelta8\teps16\teps8");
while (cnt < 1)
{
x = cnt;
//Fp16 calculation
x_1 = DecToBin(koef0, prc_16) * DecToBin(x, prc_16);
x_2 = DecToBin(x_1, prc_16) * DecToBin(x_1, prc_16);
x_3 = DecToBin(x_2, prc_16) * DecToBin(x_1, prc_16);
x_4 = DecToBin(x_2, prc_16) * DecToBin(x_2, prc_16);
x_5 = DecToBin(x_2, prc_16) * DecToBin(x_3, prc_16);
x_2vkoef1 = DecToBin(koef1, prc_16) * DecToBin(x_2, prc_16);
x_3vkoef2 = DecToBin(koef2, prc_16) * DecToBin(x_3, prc_16);
x_4vkoef3 = DecToBin(koef3, prc_16) * DecToBin(x_4, prc_16);
x_5vkoef4 = DecToBin(koef4, prc_16) * DecToBin(x_5, prc_16);
TFp0 = DecToBin(x_1, prc_16) - DecToBin(x_2vkoef1, prc_16);
TFp1 = DecToBin(TFp0, prc_16) + DecToBin(x_3vkoef2, prc_16);
TFp2 = DecToBin(TFp1, prc_16) - DecToBin(x_4vkoef3, prc_16);
TFp3 = DecToBin(TFp2, prc_16) + DecToBin(x_5vkoef4, prc_16);
Fp16 = DecToBin(TFp3, prc_16);
//Fp8 calculation
x_1 = DecToBin(koef0, prc_8) * DecToBin(x, prc_8);
x_3 = DecToBin(x_2, prc_8) * DecToBin(x_1, prc_8);
x_4 = DecToBin(x_2, prc_8) * DecToBin(x_2, prc_8);
x_5 = DecToBin(x_2, prc_8) * DecToBin(x_3, prc_8);
x_2vkoef1 = DecToBin(koef1, prc_8) * DecToBin(x_2, prc_8);
x_3vkoef2 = DecToBin(koef2, prc_8) * DecToBin(x_3, prc_8);
x_4vkoef3 = DecToBin(koef3, prc_8) * DecToBin(x_4, prc_8);
x_5vkoef4 = DecToBin(koef4, prc_8) * DecToBin(x_5, prc_8);
TFp0 = DecToBin(x_1, prc_8) - DecToBin(x_2vkoef1, prc_8);
TFp1 = DecToBin(TFp0, prc_8) + DecToBin(x_3vkoef2, prc_8);
TFp2 = DecToBin(TFp1, prc_8) - DecToBin(x_4vkoef3, prc_8);
TFp3 = DecToBin(TFp2, prc_8) + DecToBin(x_5vkoef4, prc_8);
Fp8 = DecToBin(TFp3, prc_8);
//Fe calculation
x_1 = koef0 * x;
x_2 = x_1 * x_1;
x_3 = x_2 * x_1;
x_4 = x_2 * x_2;
x_5 = x_2 * x_3;
x_2vkoef1 = koef1 * x_2;
x_3vkoef2 = koef2 * x_3;
x_4vkoef3 = koef3 * x_4;
x_5vkoef4 = koef4 * x_5;
Fe = x_1 - x_2vkoef1 + x_3vkoef2 - x_4vkoef3 + x_5vkoef4;
//Fp8 = DecToBin(Fe, prc_8);
//Fp16 = DecToBin(Fe, prc_16);
delta_8 = Math.Abs(Fe - Fp8);
delta_16 = Math.Abs(Fe - Fp16);
eps_8 = Math.Abs((delta_8 / Fe) * 100);
eps_16 = Math.Abs((delta_16 / Fe) * 100);
Console.WriteLine("{0, 2:f2} \t {1, 0:f5} \t {2, 0:f5} \t {3, 0:f5} \t {4, 0:f5}\t {5, 0:f5} \t {6, 0:f5} \t {7, 0:f5} ",
cnt, Fe, Fp16, Fp8, delta_16, delta_8, eps_16, eps_8);
cnt = cnt + dx;
}
}
}