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

#define EPS 1e-5

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

// Logic for Bisection Method
void solve_bisection(double a, double b, char* label) {
    double mid;
    int iter = 0;
    printf("\n--- Bisection Method for %s ---\n", label);
    printf("Iter | a          b          mid        f(mid)\n");

    do {
        iter++;
        mid = (a + b) / 2.0;
        printf("%4d | %10.6f %10.6f %10.6f %10.6f\n", iter, a, b, mid, f(mid));

        if (f(a) * f(mid) < 0) b = mid;
        else a = mid;

    } while (fabs(f(mid)) >= EPS);

    printf("Final Result for %s: x = %.6f\n", label, mid);
}

// Logic for False Position Method
void solve_false_position(double a, double b, char* label) {
    double mid;
    int iter = 0;
    printf("\n--- False Position Method for %s ---\n", label);
    printf("Iter | a          b          mid        f(mid)\n");

    do {
        iter++;
        // The specific formula for はさみうち法
        mid = (a * f(b) - b * f(a)) / (f(b) - f(a));
        printf("%4d | %10.6f %10.6f %10.6f %10.6f\n", iter, a, b, mid, f(mid));

        if (f(a) * f(mid) < 0) b = mid;
        else a = mid;

    } while (fabs(f(mid)) >= EPS);

    printf("Final Result for %s: x = %.6f\n", label, mid);
}

int main() {
    // Solve for both roots using Bisection
    solve_bisection(-1.0, 0.0, "Root 1");
    solve_bisection(1.0, 2.0, "Root 2");

    // Solve for both roots using False Position
    solve_false_position(-1.0, 0.0, "Root 1");
    solve_false_position(1.0, 2.0, "Root 2");

    return 0;
}
