# include
# include
# include
# include
# include
# define epx 1e-17 //epx=eps pt F
# define max 1500 //nr max de iteratii
long unsigned int cmmdc(long unsigned int a,long unsigned int b)
{
long unsigned int aux;
while(fmod(a,b))
{
aux=a;
a=b;
b=fmod(aux,a);
}
return b;
}
//-------------------------------------
long double F(long double x) { return x*x-3; }
//-------------------------------------
long double a,a_aux,b_aux,b,dc,mij,epx_aux,val;
long unsigned int ia,ia_aux,ib_aux,ib,v_N[3],v_D[3];
//[0] pt a, [1] pt mij, [2] pt b
int c,opt,pa,pb,pmax; //contor,optiune,puteri
void main()
{
clrscr();
opt=0;
while(opt!=3)
{
clrscr();
cout<<"Alegeti o optiune :\n";
cout<<"\t1. Metoda bisectiei\n";
cout<<"\t2. Metoda bisectiei utilizand insumarea FAREY\n";
cout<<"\t3. Introducere interval\n";
cout<<"\t4. TERMINARE PROGRAM\n";
cin>>opt;
if(opt!=3) cout<<"\a";
}
while(opt<=3)
{
c=1;
if(opt==3)
{
cout<<"Introduceti a,b :\n";
//Conversie la tipul: unsigned long int
char * sa,* sb;
int poz;
gets(sa);
gets(sb);
a=a_aux=_atold(sa);
b=b_aux=_atold(sb);
int i;
//pentru a --------------
poz=0; //-daca nr e intreg
for(i=0;i < strlen(sa);i++)
if(sa[i]=='.') poz=i;
pa=strlen(sa)-poz-1;//exponentul lui a; (puterea lui a)
//pentru b --------------
poz=0; //-daca nr e intreg
for(i=0;i
pb=strlen(sb)-poz-1;//exponentul lui b; (puterea lui b)
//Calcul putere maxima
if(pa>pb) pmax=pa;
else pmax=pb;
//
ib=b*pow10(pmax);
ia=a*pow10(pmax);
//Afisare de control
cout.precision(12);
cout<<"Am citit datele:\n"<< a <<" "<< b;
cout<<"\nDatele convertite sunt:\n"<< ia <<" "<< ib;
getche();
}
if(opt<=2)
{
a=a_aux;
b=b_aux;
//Initializari
if(opt==1) mij=(a+b)/2;
else if(opt==2)
{
v_N[0]=ia;
v_D[0]=pow10(pmax);
//----------------------
dc=cmmdc(v_N[0],v_D[0]);
cout<<"\n v_*[0]= "<
v_D[0]=v_D[0]/dc;
cout<<"Dupa siplif cu "<
//----------------------
v_N[2]=ib;
v_D[2]=pow10(pmax);
//----------------------
dc=cmmdc(v_N[2],v_D[2]);
cout<<"\n v_*[2]= "<
v_D[2]=v_D[2]/dc;
cout<<"Dupa siplif cu "<
//----------------------
v_N[1]=v_N[0]+v_N[2];
v_D[1]=v_D[0]+v_D[2];
//----------------------
dc=cmmdc(v_N[1],v_D[1]);
cout<<"\n v_*[1]= "<
v_D[1]=v_D[1]/dc;
cout<<"Dupa siplif cu "<
//----------------------
mij=(long double)(v_N[1])/(long double)(v_D[1]);
}
c=0;
epx_aux=epx+1;
val=fabs(F(mij));
while((c < max)&&(val >= epx))
{
epx_aux=fabs(F(mij)/mij);
if(F(a)*F(mij)< 0)
{
if(opt==1) b=mij;
else
{
v_N[2]=v_N[1];
v_D[2]=v_D[1];
//----------------------
dc=cmmdc(v_N[2],v_D[2]);
cout<<"\n v_*[2]= "<
v_D[2]=v_D[2]/dc;
cout<<"Dupa siplif cu "<
//----------------------
b=(long double)v_N[2]/(long double)v_D[2];
}
}
else if((F(mij)*F(b)< 0)&&(F(a)*F(mij) > 0))
{
if(opt==1) a=mij;
else
{
v_N[0]=v_N[1];
v_D[0]=v_D[1];
//----------------------
dc=cmmdc(v_N[0],v_D[0]);
cout<<"\n v_*[0]= "<
v_D[0]=v_D[0]/dc;
cout<<"Dupa siplif cu "<
//----------------------
a=(long double)v_N[0]/(long double)v_D[0];
}
}
if(opt==1) mij=(a+b)/2;
else
{
v_N[1]=v_N[0]+v_N[2];
v_D[1]=v_D[0]+v_D[2];
//----------------------
dc=cmmdc(v_N[1],v_D[1]);
cout<<"\n v_*[1]= "<
v_D[1]=v_D[1]/dc;
cout<<"Dupa siplif cu "<
mij=(long double)(v_N[1])/(long double)(v_D[1]);
}
c++;
cout.precision(12);
cout<
if(c>=max) cout<<"\n Nr. de it. ="<
cout<<"\n";
cout<<"\nNr. de it. PRG ="<
cout<
cout<<"\t2. Metoda bisectiei utilizand insumarea FAREY\n";
cout<<"\t3. Modificare interval\n";
cout<<"\t4. TERMINARE PROGRAM\n";
cin>>opt;
}
}
