IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Вычисление относительной погрешности для функции.
Krjuger
сообщение 12.04.2011 17:19
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


В общем это некое продолжение моей прошлой темы,только обрастающее новыми подробностями.
У меня дана функция x(expx-1).Я эту функцию раскладываю я ряд Тейлора и получаю сумма от 1 до N от xn+1/n!.
Чтобы найти относительную погрешность мне надо а -n ый член разделить на сумму ряда,все это по модулю.Ну в общем то ,я думаю, вы и так понимаете как это делать.Суть заключается в том,у меня опять есть ограниченная разрядность мантисы и мне надо посмотреть как она будет влиять на результат.И как будет меняться N при которых мы будем выходить за граници возможностей нашей машины.

Я немного абстрагировался от этой задачи.что я сделал, при помощи маткада я посчитал,при каком N будет достигаться относительная погрешность на грани машинного эпсилон 10-16,это N =24.Да забыл сказать,что точка в которой мы раскладываем ряд у меня дана.Это -2.3.Затем я высчитал значение этой погрешности она составила 8.602898672363349*10^-16.Дальше я посомтрел как оно себя будет вести при разрядах мантисы от 10 до 25,при фиксированных исходных данных.Для рязрядности с 10 до 16 я получил ожидаемый результат,но дальше начало твориться что то вообще непонятное.Ну или точнее я не могу понять, как это интерпретировать.
ИзображениеФайл с самой программой тоже прикрепляю.


Прикрепленные файлы
Прикрепленный файл  ChMet_Laba_1.cpp ( 1.24 килобайт ) Кол-во скачиваний: 250
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Krjuger
сообщение 17.04.2011 13:07
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Я немного поработал на округлением,а то до этого не совсем корректно выводились данные и в итоге пришел к следующему варианту.

#include <iostream>
#include <math.h>
#include <iomanip>


using namespace std;

long double Round(long double chislo, int n)
{
long double result;
__int64 iChislo;
double drob;
int k=0;
if (chislo<0)
k=-1;
else
k=1;
iChislo = (__int64) chislo;
drob = chislo - iChislo;
result=((__int64) (drob*pow(10.0,n)+k*0.5))/pow(10.0,n);
result = iChislo + result;
return result;
}


long double Cut(long double value,int m)
{
int n=0;
long double temp=abs(value);
while (temp>=1)
{
temp=temp/10;
n++;
}
value=Round(value,abs(m-n));
return value;
}

long double Sum(long double num,int n,int m)
{
long double temp=0;
long double tmp=0;
for (int i=1;i<=n;i++)
{
tmp=pow(num,i+1);
tmp=Cut(tmp,m);
for (int j=2;j<=i;j++)
{
tmp=tmp/j;
tmp=Cut(tmp,m);
}
temp+=tmp;
temp=Cut(temp,m);
}
return temp;
}

long double DeltaPogr (long double x,int n,int m)
{
long double temp=0.0;
long double an=0.0;
long double tmp=0.0;
int p=0;
int d=0;
an=pow(x,n+1);
for (int j=2;j<=n;j++)
{
an=an/j;
}
while (abs(an)>=1)
{
an/=10;
p++;
}
an=Cut(an,m);
an=an*pow(10.0,p);
cout <<" a" << n << " elem: " << an;
temp=abs(an/Sum(x,n,m));
temp=Cut(temp,m);
cout <<" Pogr iz " << n << " elem:" << temp;
tmp=abs(Sum(x,n,m));
while (tmp>=1)
{
tmp/=10;
d++;
}
tmp=Cut(tmp,m);
tmp=tmp*pow(10.0,d);
cout << " Summa : " << tmp << endl;
return temp;
}

void main()
{
long double num=0.0;
long double res=0.0;
long double x1,x2;
long double eps=0.0;
long double temp=0.0;
int m=0;
int s=0;
int N;
x1=-2.3;
x2=-17.0;
for (int i=5;i<=8;i+=3)
{
cout << "Razryadnost* manticy:" << i << endl;
N=0;
m=0;
s=0;
eps=1/pow(2.0,i-1);
temp=eps;
while (temp<=1)
{
temp*=10;
m++;
}
cout << "Epsilon:"<< eps << endl;
do
{
s++;
N++;
res=DeltaPogr(x1,s,m);
}
while (abs(res)>=eps);
cout << "Kol-vo chlenov ryada:" << N << endl;
}
}



Для точки x1 вроде правильно считает,но с выводом нечто неладное.
Volvo,Вы раньше упоминали,что выводить надо с точностью до десятой,я не совсем понял при каких случаях.Например,nxt = -4.5E-02 ,что равно -0.045 при эпсилон 0.0625 при выводе правильно выводить -0.04 или все равно выводить -0.045?Просто как я не крутился,но ответ предстает в виде.
Изображение
Если я хочу вывести все таки -0.045,то тогда у меня у всех чисел начинают появляться по 1 цифре...

Следующий вопрос,можно ли как то принудительно заставить выводить через экспоненту,потому что для второго корня числа выводятся не очень красиво.
Изображение

Ну и последний вопрос,можно ли все это как нибудь оптимизировать,потому,что я программе очень много повторяющегося кода,и слишком много на мой взгляд циклов,но как от них избавиться я не знаю.

Надеюсь мне все таки ответят. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.07.2025 14:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"