/* bisec2_2.c: 初期区間逆入力可能バージョン */ #include #include #define N 100 double f(double x) // f(x) = x^2 - 2 { return x * x - 2.0; } int main(void) { int n=0; double x1=1, x2=2, x3, err; double eps = 1.0e-6; char s[128]; fprintf(stderr, "# x1, x2 = "); fgets(s, 128, stdin); sscanf(s, "%lf%lf", &x1, &x2); fprintf(stderr, "# eps = "); fgets(s, 128, stdin); sscanf(s, "%lf", &eps); printf("# n, x, err\n"); do { n++; if (n > N) { fprintf(stderr, "*** 反復回数が100回を超えました。***"); break; } x3 = (x1 + x2) / 2.0; if (f(x1)*f(x3) < 0.0) x2 = x3; else x1 = x3; err = fabs(x2 - x1); printf("%4d, % .15e, % .15e\n", n, x3, err); } while (err >= eps); printf("\n# sqrt(2) = % .15e\n", (x1 + x2) / 2.0); return 0; } /* --- 実行例 --- Z:\proen1\kadai4>bisec2_2 # x1, x2 = 2 1 # eps = 1e-6 # n, x, err 1, 1.500000000000000e+000, 5.000000000000000e-001 2, 1.250000000000000e+000, 2.500000000000000e-001 3, 1.375000000000000e+000, 1.250000000000000e-001 4, 1.437500000000000e+000, 6.250000000000000e-002 5, 1.406250000000000e+000, 3.125000000000000e-002 6, 1.421875000000000e+000, 1.562500000000000e-002 7, 1.414062500000000e+000, 7.812500000000000e-003 8, 1.417968750000000e+000, 3.906250000000000e-003 9, 1.416015625000000e+000, 1.953125000000000e-003 10, 1.415039062500000e+000, 9.765625000000000e-004 11, 1.414550781250000e+000, 4.882812500000000e-004 12, 1.414306640625000e+000, 2.441406250000000e-004 13, 1.414184570312500e+000, 1.220703125000000e-004 14, 1.414245605468750e+000, 6.103515625000000e-005 15, 1.414215087890625e+000, 3.051757812500000e-005 16, 1.414199829101563e+000, 1.525878906250000e-005 17, 1.414207458496094e+000, 7.629394531250000e-006 18, 1.414211273193359e+000, 3.814697265625000e-006 19, 1.414213180541992e+000, 1.907348632812500e-006 20, 1.414214134216309e+000, 9.536743164062500e-007 # sqrt(2) = 1.414213657379150e+000 */