/*
[1] 授業単元： 現象数理
[2] 問題文(含コード&リンク)：
f(x) = cosx - x^2 = 0 の近似解を求めるプログラムを作り、以下の問題を解け。
なお、二分法を用いること。
&#8232;a = 0, b = 1 からa, b, c の値を求める。
&#8232;|b - a| < 10^(－6) の条件を満たすまで実行し、
もしくはこの条件を満たさない場合は30 回実行し、各回のa, b, cの値をまとめる。
[3] 環境
　[3.1] OS：Linux
　[3.3] 言語：C
[4] 期限：2013年10月26日24:00まで
[5] その他の制限：特にありません。
お願いします。
*/

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

double f(double x)
{
  return cos(x) - x * x;
}

int main()
{
  int i, lim = 30;
  double a = 0.0, b = 1.0, eps = 1e-6;
  double c, fa = f(a), fc;

  if (fa == 0) { // f(a) == 0 なら答えわかってるやんｗ
    printf("a=%g is the answer.\n", a);
    return 0;
  }
  if (fa * f(b) > 0) { // f(a),f(b) 同符号 => 二分法では根を見つけられへん
    printf("i can't find the answer.\n");
    return 1;
  }
  for (i = 0; i < lim; i++) {
    c = (a + b) * 0.5;
    fc = f(c);
    printf("i=%d,a=%g,b=%g,c=%g,f(c)=%g\n", i, a, b, c, fc);
    if (fabs(b - a) < eps || fc == 0) break;
    if (fa * fc < 0) // f(a),f(c) 異符号 => a と c の間に根がある
      b = c;
    else // f(a),f(c) 同符号 => c と b の間に根がある
      a = c;
  }
  printf("c=%g is the answer.\n", c);
  return 0;
}
