Liczba double - Blad wzgledny bliski 0

0

Witam wszystkich !```

Do wykonania mam zadanie realizujace Efekt Rungego ,dla interpolacji Newtona.
Moj problem polega na wyliczeniu bledu wzglednego(Linijka 67). Za wartosc dokladna przyjmuje wynik funkcji (1/(1+25(x^2)) ,noi po odjeciu i podzieleniu powinno wyjsc 0 ,jednak wynik jest wyswietlny ,jako bardzo zblizony do zera ,w jaki sposob wyswietlic wynik ,tak aby wyswietlany byl jako 0? Poniżej załączam kod programu:

#include<iostream>
#include<conio.h>
#include <cmath>

using namespace std;

double func(double x) 
{
return 1/(1+25*(x*x));
}

double interpol(int n)
{
	
	double * f = new double[n];
    double * arg = new double[n];
	double a;
	cout<<"Podaj x do interpolacji";
	cin>>a;
	
	
	double x,dx,xk,xp;

	int i,j;
	
	xp=-1;
	xk=1;
	
	dx = (xk - xp) / (double)n;

	for (i=0; i<n; i++) 
	{
	x = xp + i*dx;
	
		
	arg[i]=x;
	f[i]=func(x);
	
	//cout<<"X: "<< arg[i]<<"|";
	//cout<<"Y: "<< f[i]<<endl;

	}

    double  mult;
    double sum=0;
    
    for(j=0;j<n-1;j++)
    {
        for(i=n-1;i>j;i--)
            f[i]=(f[i]-f[i-1])/(arg[i]-arg[i-j-1]);
    }
    for(i=n-1;i>=0;i--)
    {
        mult=1;
        for(j=0;j<i;j++)
            mult*=(a-arg[j]);
            
        mult*=f[j];
        sum+=mult;
         
    }
   	cout<<"Wynik interpolacji: "<<sum<< " dla: x= "<<a<<endl;
   	
   	cout<<"Wynik z funkcji: "<<func(a)<< " dla: x= "<<a<<endl;
   	
   	double epsilon,blad;
   	blad=(fabs(func(a)-sum)/func(a))*100;
   	
   	if(round(blad)==0)
   	{
   		blad=nearbyint(blad);
	}
   	

   	
   	cout<< "Blad  wzgledny wynosi:" <<blad<<"%"<<endl;
   	
   	delete [] f;
	delete [] arg;
	
	return blad;
	
   
}





int main()
{
	
	int i,n;
	i=0;
	cout<<"Ilosc punktow : ";
    cin>>n;
	
	
	
	//print(n,xp,xk,dx,arg,f);
	
	interpol(n);
	
	/*
	
	double * blad = new double[n];
	
	for(i=0;i<n;i++)
	{
	blad[i]=interpol(n);
	
	
	
	}
	cout<<"Bledy: "<<endl;
	for(i=0;i<n;i++)
	{
		
		cout<<blad[i]<<endl;
	}
	
	delete [] blad;
	
	*/
	
    return 0;
}







0

Pytanie, po co Chcesz wyświetlic wynik, jako zero, ze względów estetycznych, czy jak?

0
lion137 napisał(a):

Pytanie, po co Chcesz wyświetlic wynik, jako zero, ze względów estetycznych, czy jak?

Bo podajac ilosc punktow jako 100,nastepnie podajac x jako 0.1 wartosc obliczona z interpolacji dla Niego jest taka sama ,jak otrzymana z funkcji. No i powinno wyjsc 0 z wzoru na blad wzgledny (fabs(0.8-0.8)/0.8) ,a wychodzi 3.76838e-006% ,co jest bardzo zblizone do 0,ale jednak Nim nie jest.

0

Debugowałeś/ Sprawdzałeś jakoś, czy te wartości na pewno są takie same?

0
lion137 napisał(a):

Debugowałeś/ Sprawdzałeś jakoś, czy te wartości na pewno są takie same?

Linijka 63 wyswietla wynik z interpolacji
Linijka 65 wyswietla wynik z funkcji

Oba daja 0.8

0
Adiseeker napisał(a):
lion137 napisał(a):

Debugowałeś/ Sprawdzałeś jakoś, czy te wartości na pewno są takie same?

Linijka 63 wyswietla wynik z interpolacji
Linijka 65 wyswietla wynik z funkcji

Oba daja 0.8

POPRAWKA :
jak dalem setprecission(16)
To wyniki jednak sie roznia nieznacznie niestety.

0.8
0.799999969852922

Dziękuje !

1 użytkowników online, w tym zalogowanych: 0, gości: 1