#include < stdio.h > 
#include < math.h > 
#include < stdlib.h > 
#define FMT "%-10.6g"
float f(float x) {
    return pow(x, 1.5);
}
float Romberg(float a, float b, float eps) {
    int i,
    k;
    long int kk;
    float h,
    *T1,
    *T2,
    t;
    k = 0;
    h = b - a;
    T1 = (float * ) malloc(sizeof(float));
    T2 = (float * ) malloc(2 * sizeof(float));
    T1[0] = (f(a) + f(b)) * h / 2.0;
    T2[0] = (T1[0] + h * f(a + h / 2.0)) / 2.0;
    T2[1] = (4.0 * T2[0] - T1[0]) / 3.0;
    k = 2;
    h /= 2.0;
    kk = 1;
    printf(FMT, T1[0]);
    printf("\n");
    printf(FMT, T2[0]);
    printf(FMT, T2[1]);
    printf("\n");
    while (fabs(T2[k - 1] - T1[k - 2]) >= eps) {
        free(T1);
        T1 = (float * ) realloc(T2, k * sizeof(float));
        T2 = (float * ) malloc((k + 1) * sizeof(float));
        t = 0.0;
        kk *= 2;
        for (i = 0; i < kk; i++) t += f(a + i * h + h / 2.0);
        T2[0] = (T1[0] + h * t) / 2.0;
        for (i = 1; i <= k; i++) {
            t = pow(4.0, (float) i);
            T2 = (t * T2 - T1) / (t - 1.0);
        }
        k++;
        h /= 2.0;
        for (i = 0; i < k; i++) {
            printf(FMT, T2);
        }
        printf("\n");
    }
    t = T2[k - 1];
    free(T1);
    free(T2);
    return t;
}
void main() {
    float t;
    printf("\n");
    t = Romberg(0.0, 1.0, 1e-5);
    printf("\nRomberg:\n");
    printf(FMT, t);
}