Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
15
Добавлен:
12.02.2016
Размер:
207.48 Кб
Скачать

Виконання роботи

Завдання:

50

(| 7x/9 | 1)

x]-1.,1[

x= 0.06

  1. Згідно поставленого завдання, аналітичний вид математичної функцій, що буде обчислюватися, буде мати вигляд( для наочності обчислень беремо 5 членів ряду):

  1. На основі отриманого виразу обчислюємо еталонне значення функції на проміжку зміни х, fe(x).

Обчислені значення fe заносимо у відповідний стовпець Таблиці 1.

  1. Мінімальне обчислене значення fe рівне -1,24184, а максимальне 0,58641. Для обчислення значення функції f8 та f16 потрібно виконати узгодження з розрядністю обчислених коефіцієнтів, змінної х та результату.

    1. Приведення коефіцієнтів та змінної х до формату з фіксованою комою довжиною 8 біт( для f8). Згідно завдання х міняється в межах -1..1 а згідно обчислення, коливається в межах -1.5..0,57. Отже для представлення х, коефіцієнтів та результату потрібно вибрати кількість розрядів для цілої частини та дробової частини з врахуванням того що їх загальна кількість 8. Оскільки в нас результат є знаковим і , ціла частина змінної х коливається від 0 до 1 (0 до 1). Таким чином для кодування цілої частини змінної х необхідно 1 двійковий розряд і один розряд для кодування даних. Отже для дробової частини залишається 6 розрядів.

    2. Приведення коефіцієнтів та змінної х до формату з фіксованою комою довжиною 16 біт( для f16). Згідно завдання х міняється в межах -1..1 а згідно обчислення, коливається в межах -1.5..0,57. Отже для представлення х, коефіцієнтів та результату потрібно вибрати кількість розрядів для цілої частини та дробової частини з врахуванням того що їх загальна кількість 16. Оскільки в нас результат є знаковим і , ціла частина змінної х коливається від 0 до 1 (0 до 1). Таким чином для кодування цілої частини змінної х необхідно 1 двійковий розряд і один розряд для кодування даних. Отже для дробової частини залишається 14 розрядів.

При використанні типів даних з рухомою комою не виникає проблеми з представленням чисел з великою кількістю чисел після коми( довгої дробової частини). При використанні форматів з фіксованою комою необхідно виконати переведення з числа у фіксований формат.

  1. Після обчислення всіх значень fe f8 f16 виконуємо обчислення абсолютної та відносної похибки проведених обчислень для всіх значень х з заданого діапазону .

  2. На основі проведених розрахунків похибок виводимо відповідні графіки.

Таблиця 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;

}

}

}