/* newton1_1.c: f(x), f'(x) 独立バージョン */ #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 } int main(void) { int n = 0; double x, x0, err, 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, 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); printf("\n# sqrt(%e) = % .15e\n", a, x); return 0; } /* --- 実行例 --- Z:\proen1\kadai4>newton1_1 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 */