/* bisec2_1.c: 反復回数制限バージョン */ #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 = 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_1 # x1, x2 = 1 2 # eps = 1e-16 # 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 ... 90, 1.414213562373095e+000, 2.220446049250313e-016 91, 1.414213562373095e+000, 2.220446049250313e-016 92, 1.414213562373095e+000, 2.220446049250313e-016 93, 1.414213562373095e+000, 2.220446049250313e-016 94, 1.414213562373095e+000, 2.220446049250313e-016 95, 1.414213562373095e+000, 2.220446049250313e-016 96, 1.414213562373095e+000, 2.220446049250313e-016 97, 1.414213562373095e+000, 2.220446049250313e-016 98, 1.414213562373095e+000, 2.220446049250313e-016 99, 1.414213562373095e+000, 2.220446049250313e-016 100, 1.414213562373095e+000, 2.220446049250313e-016 *** 反復回数が100回を超えました。*** # sqrt(2) = 1.414213562373095e+000 */