/* newton1_3.c: 関数ポインタ使用バージョン */ #include // fprintf, printf, fgets, sscanf #include // fabs double a = 2; double f(double x) { return x * x - a; // f(x) = x^2 - a } double df(double x) { return 2 * x; // f'(x) = 2x } double newton(double x, double (*f)(double), double (*df)(double), double eps) /* Solving f(x) = 0 by Newton Method x: initial value of x f(x): left term of equation f(x)=0 df(x): derivative of f(x) eps: error */ { int n = 0; double x0, err; printf("# n, x, err\n"); printf("%4d, % .15e\n", n, x); do { n++; x0 = x; x = x0 - f(x0) / df(x0); err = fabs(x - x0); printf("%4d, % .15e, % .15e\n", n, x, err); } while (err >= eps); return x; } int main(void) { double x, eps = 1.0e-10; char s[128]; fprintf(stderr, " a = "); fgets(s,128,stdin); sscanf(s, "%lf", &a); while (a <= 0.0) { fprintf(stderr, "'a' には正の数を入れてください。\n"); fprintf(stderr, " a = "); fgets(s,128,stdin); sscanf(s, "%lf", &a); } x = (a + 1.0) / 2.0; printf("\n# sqrt(%e) = % .15e\n", a, newton(x, f, df, eps)); return 0; } /* --- 実行例 --- Z:\proen1\kadai4>newton1_3 a = 2 # n, x, err 0, 1.500000000000000e+000 1, 1.416666666666667e+000, 8.333333333333326e-002 2, 1.414215686274510e+000, 2.450980392156854e-003 3, 1.414213562374690e+000, 2.123899820016817e-006 4, 1.414213562373095e+000, 1.594724352571575e-012 # sqrt(2.000000e+000) = 1.414213562373095e+000 */