Witam.
Muszę rozwiązać f-cję metodą bisekcji. Problem jest następujący: gdy liczę f-cję podaną w zadaniu na liczbach typu double, program zwraca NAN, jeżeli zmienię na long double, program działa ale zawsze zwraca -2, co jest błędem (wynik policzony przy pomocy wolfram:x=0.00258516). Mam też f-cje sprawdzającą działanie programu (bardzo prosta) i dla niej działa poprawnie na liczbach double, źle na long double. Nie potrafię znaleŹć błędu który powoduje takie działanie.
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<iomanip>
using namespace std;
long double bisek(long double(*funkcja)(long double),long double a,long double b,long double epsilon)
{
long double ya, yb, x, y;
ya=funkcja(a);//licznie wartosci f-cji w koncach przedzialu
yb=funkcja(b);
if(ya*yb>=0)//sprawdzenie czy wewnątrz przedziału smienia się znak f-cji, czy jest miejsce zerowe w tym przedziale
{
return NAN;//jezli nie ma
}
do //jesli jest
{
x=(a+b)/2;//zmniejsz przedał
y=funkcja(x);//policz wartosc w nowym koncu
if(y==0)
{
return x;
}
if(ya*y<0)//sprawdz znak f-cji w nowym przedziale
{
b=x;
yb=y;
}
else
{
a=x;
ya=y;
}
}
while(fabs(b-a)>epsilon);//wykonuj dopoki przedzial jest wiekszy od epsilon
return x;
}
long double funkcja1(long double x)//f-cja którą muszę policzyć
{
return ((0.518*223.0)/(x-0.0018707))-(12.612620/(x*(x+0.0012707)*sqrt(223.0)))-65000.0;
}
double funkcja2(double x)//f-cja do sprawdzania dzialania programu
{
return (x-2.13)*(x-2.13)*(x-2.13);
}
int main()
{
cout.precision(10);
int nr;
long double (*funkcja)(long double), a, b, epsilon=1e-16,x;
cout<<"podaj a:";
cin>>a;
cout<<"\npodaj b:";
cin>>b;
cout<<"\nfunkcje do wyboru:\n1: f-cja\n2: f-cja sprawdzajaca:\n"<<endl;
cout<<"\nPodaj numer funkcji:";
cin>>nr;
switch(nr)
{
case 0:
cout<<"to nie jest nr funkcji!";
break;
case 1:
funkcja = funkcja1;
break;
/*case 2:
funkcja = funkcja2;
break;*/
default:
cout<<"to nie jest nr funkcji!";
break;
}
x=bisek(funkcja, a, b, epsilon);
cout<<"miejsce zerowe funkcji to:"<<x<<endl;
system("PAUSE");
return 0;
}