#include "stdio.h"
#include "conio.h"
#include "math.h"
#define EPS 1e-6
double f(double x) { return 4/(1+x*x); }
double Romberg(double a,double b,double(*f)(double),double eps)
{
    int i , m , n=1 , j=1 ;
    double h , sum , p ;
    double T[10][10];
    h = (b-a)/2;
    T[0][0] = h*( f(a) + f(b) );
    printf("T(0,0)=%f\n",T[0][0]);
    do                                //Romberg算法
    {
         sum=0.0;
        for( i=1 ; i <= n ; i++ )
          sum = sum + f( a + ((2*i-1)*h) );
        T[j][0] = ( T[j-1][0]/2) + ( h*sum );
        printf("T(0,%d)=%f\n",j,T[j][0]);
        for( m=1 ; m <= j ; m++ )
        {
            p = pow( 4 , (double)(m) );
            T[j-m][m] = ( p * T[j-m+1][m-1] - T[j-m][m-1] ) / (p-1);
            printf("T(%d,%d)=%f",m,j-m,T[j-m][m]);
        }
        m--;
        h = h/2;
        n = n*2;
        j++;
        
    } while ( fabs( T[0][m] - T[0][m-1] ) > eps );
    return (T[0][m]);
}
main()
{
    printf("\n\n积分结果 =  %f\n", Romberg(0 , 1 , f , EPS));
}