Мисля, че не си разбрал правилно метода на разполовяването..
QUOTE
Метод на разполовяването. Това е един малко бавен, но абсолютно надежден алгоритъм. Ако f(x) се пресмята достатъчно бързо той е и най-добрият избор. Методът се основава отново на предположението, че има област (a,b), където f(a)f(b)<0. Нека х1 е средата на (a,b). Ако f(a)f(x1)<0 делим интервала (а,х1) и означаваме с х2 средата му, в противен случай с х2 бележим средата на (х1,b). Продължаваме този алгоритъм докато получим област (xn,xn+1), така че |xn-xn+1|<e. Със сигурност можем да твърдим, че в посочения интервал има поне един корен.
Лесно можем да изчислим, колко итерации са необходими за постигане на дадена точност. Нека например първоначалния интервал е 1, а търсената точност е 10^-16 (машинният епсилон за числа с двойна точност в Паскал и Фортран). При всяка итерация интервала се разполовява, така след n итерации той ще е 1/2n. оттук получаваме:

или

(5)
Уравнение (5) показва, че са необходими приблизително 53 итерации за постигане на нужната точност. При всяка итерация функцията се изчислява само веднъж, така че са необходими всичко 53 изчисления на функцията. При съвременните възможности на изчислителните машини това не би трябвало да представлява трудност дори за тези със скромни възможности.
Методът на разполовяването има един съществен недостатък: той е неприложим ако коефициентите на нелинейното уравнение са комплексни, а също и за система уравнения.
ИзточникА, ето ти и програмата..
CODE
using namespace std;
#include <iostream>
#include <math.h>
long double IntervalHigh = 0,
IntervalLow = 0,
Sensitivity = 0.000001;
int PositionInEquation = 0;
char Equation[ 129 ],
Element[ 129 ];
void PrintHeader();
void GetInterval();
void GetEquation();
void GetSensitivity();
void GetRoot();
char GetElement();
long double F( long double x);
long double CalculateElement( long double x );
void main()
{
PrintHeader();
GetEquation();
GetInterval();
GetSensitivity();
system("pause");
GetRoot();
system("pause");
}
void PrintHeader()
{
printf( "\n\nTazi programa namira koren na f(x)=0 po metoda na razpolovqvaneto\n"
"Avtor: Ime Prezime Famiq\n\n" );
}
void GetEquation()
{
Equation[ 0 ] = 0;
while( strlen( Equation ) < 2 )
{
printf( "\nVyvedete funkciqta f(x)=" );
gets( Equation );
if( strlen( Equation ) < 2 )
printf( "\n\7Uravnenieto trqbva da byde pone 2 simvola!\n\n" );
}
}
void GetInterval()
{
char TempString[ 129 ],
Done = 0;
while( !Done )
{
Done = 1;
TempString[ 0 ] = 0;
while( !strlen( TempString ) )
{
printf( "\nVyvedete dolnata granica na intervala za tyrsene: " );
gets( TempString );
}
IntervalLow = atof( TempString );
TempString[ 0 ] = 0;
while( !strlen( TempString ) )
{
printf( "Vyvedete gornata granica na intervala za tyrsene: " );
gets( TempString );
}
IntervalHigh = atof( TempString );
if( IntervalLow == IntervalHigh )
{
Done = 0;
printf( "\n\7Gornata i dolnata granica na intervala syvpadat. Molq, vyvedete novi granici.\n" );
}
if( IntervalLow > IntervalHigh )
{
Done = 0;
printf( "\n\7Dolnata granica na intervala e po-golqma ot gornata. Molq, vyvedete novi granici.\n" );
}
}
}
void GetSensitivity()
{
char TempString[ 129 ];
printf( "\nShte byde izpolzvana standartna tochnost %1.16f\n"
"Vyvedete tochnost, koqto iskate da se izpolva\n"
"ili natisnete ENTER za zapazvane na standartnata: ", Sensitivity );
gets( TempString );
if( ( atof( TempString ) ) &&
( atof( TempString ) > 0 ) )
Sensitivity = atof( TempString );
printf( "\nIzpolzvana tochnost: %1.16f\n\n", Sensitivity );
}
void GetRoot()
{
long double low = IntervalLow,
high = IntervalHigh,
middle, value;
while( 1 )
{
middle = low + ( high - low ) / 2;
value = F(middle);
printf( "Interval: %2.16f : %2.16f\n", low, high );
if( fabs( value ) < Sensitivity )
{
printf( "\nKorenyt e: %2.16f\n", middle );
break;
}
if( high == low )
{
printf( "\nNqma koren v posocheniq interval!\7\n" );
break;
}
if( F(low)*F(middle) < 0 )
high = middle;
else
low = middle;
}
}
long double F(long double x)
{
long double ReturnValue = 0;
PositionInEquation = 0;
while( GetElement() )
ReturnValue += CalculateElement( x );
return ReturnValue;
}
long double CalculateElement( long double x )
{
long double Temp = 0,
ReturnValue = 0;
int Loop = 1, Exponent = 0;
if( ( Element[ 1 ] >= '0' ) && ( Element[ 1 ] <= '9' ) )
{
for(; Loop < strlen( Element ); Loop++ )
{
if( ( Element[ Loop ] < '0' ) || ( Element[ Loop ] > '9' ) )
break;
if( !Temp )
Temp = Element[ Loop ] - 48;
else
Temp = Temp * 10 + Element[ Loop ] - 48;
}
}
if( ( Element[ Loop ] == 'x' ) || ( Element[ Loop ] == 'X' ) )
{
if ( Element[ Loop + 1 ] == '^' )
{
for( Loop += 2; Loop < strlen( Element ); Loop++ )
{
if( ( Element[ Loop ] < '0' ) || ( Element[ Loop ] > '9' ) )
break;
if( !Exponent )
Exponent = Element[ Loop ] - 48;
else
Exponent = Exponent * 10 + Element[ Loop ] - 48;
}
}
else
Exponent = 1;
}
if( Temp )
ReturnValue = Temp;
else
ReturnValue = 1;
if( Exponent )
ReturnValue *= pow( x, Exponent );
if( Element[ 0 ] == '-' )
ReturnValue = -ReturnValue;
return ReturnValue;
}
char GetElement()
{
char ReturnValue = 0,
TempString[ 2 ] = { 0, 0 };
Element[ 0 ] = 0;
if( !PositionInEquation )
{
if( Equation[ 0 ] == '-' )
{
strcat( Element, "-" );
PositionInEquation++;
}
else
{
strcat( Element, "+" );
if( Equation[ 0 ] == '+' )
PositionInEquation++;
}
}
else
{
if( ( Equation[ PositionInEquation ] == '+' ) ||
( Equation[ PositionInEquation ] == '-' ) )
{
TempString[ 0 ] = Equation[ PositionInEquation ];
strcat( Element, TempString );
PositionInEquation++;
}
}
for(; PositionInEquation < strlen( Equation ); PositionInEquation++ )
{
if( ( Equation[ PositionInEquation ] == '+' ) || ( Equation[ PositionInEquation ] == '-' ) )
break;
TempString[ 0 ] = Equation[ PositionInEquation ];
strcat( Element, TempString );
ReturnValue = 1;
}
return ReturnValue;
}