#include <stdio.h>
#include <math.h>

#define EPS 1e-5

double f(double x) {
    return x*x - 1 - sin(x);
}

double bisection(double xl, double xr) {
    double xi;
    int i = 0;

    printf("\n   二分法   \n");
    printf("i\t xl\t\t xi\t\t xr\t\t f(xl)\t\t f(xi)\t\t f(xr)\n");

    while (1) {
        i++;
        xi = (xl + xr) / 2.0;

        printf("%d\t %.6f %.6f %.6f %.6f %.6f %.6f\n",
               i, xl, xi, xr, f(xl), f(xi), f(xr));

        if (fabs(f(xi)) < EPS) {
            printf("→ Root ≈ %.6f\n", xi);
            return xi;
        }

        if (f(xl) * f(xi) < 0)
            xr = xi;
        else
            xl = xi;
    }
}


double false_position(double xl, double xr) {
    double xi;
    int i = 0;

    printf("\n    はさみうち法    \n");
    printf("i\t xl\t\t xi\t\t xr\t\t f(xl)\t\t f(xi)\t\t f(xr)\n");

    while (1) {
        i++;

        xi = (xl * f(xr) - xr * f(xl)) / (f(xr) - f(xl));

        printf("%d\t %.6f %.6f %.6f %.6f %.6f %.6f\n",
               i, xl, xi, xr, f(xl), f(xi), f(xr));

        if (fabs(f(xi)) < EPS) {
            printf("→ Root ≈ %.6f\n", xi);
            return xi;
        }

        if (f(xl) * f(xi) < 0)
            xr = xi;
        else
            xl = xi;
    }
}

int main() {
    printf("f(x) = x^2 - 1 - sin(x) = 0\n");

    printf("==============区間[-1, 0]================\n");
    bisection(-1.0, 0.0);
    false_position(-1.0, 0.0);

    printf("===========区間[1, 2]===================\n");
    bisection(1.0, 2.0);
    false_position(1.0, 2.0);

    return 0;
}
