#include <stdio.h>
#include <math.h>
// 計算する値の個数
#define N 20
// 円周率
#define M_PI acos(-1.0)
// 微分係数を計算する点
#define x0 (M_PI / 8)
// 真の値 = sqrt(2)
#define d0 sqrt(2)
// 関数 f
double f
(double x
) { return sin(2 * x
); }
// 相対誤差を計算する関数
double err
(double x
) { return fabs(x
- d0
) / d0
; }
// D_f
double dif_f(double x, double h) { return (f(x + h) - f(x)) / h; }
// D_m
double dif_m(double x, double h) { return (f(x + h) - f(x - h)) / (2 * h); }
int main(void) {
for(int k = 0; k < N; k++) {
// 刻み幅
double h
= pow(2, -3 - k
);
// D_m の計算値
double y = dif_m(x0, h);
// 値と誤差を表示
printf("%2d: %e %.16lf %e %e\n", k
, h
, y
, err
(y
), err
(dif_f
(x0
, h
))); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiAKLy8g6KiI566X44GZ44KL5YCk44Gu5YCL5pWwCiNkZWZpbmUgTiAyMAogCi8vIOWGhuWRqOeOhwojZGVmaW5lIE1fUEkgYWNvcygtMS4wKQogCi8vIOW+ruWIhuS/guaVsOOCkuioiOeul+OBmeOCi+eCuQojZGVmaW5lIHgwIChNX1BJIC8gOCkKIAovLyDnnJ/jga7lgKQgPSBzcXJ0KDIpCiNkZWZpbmUgZDAgc3FydCgyKQogCi8vIOmWouaVsCBmCmRvdWJsZSBmKGRvdWJsZSB4KSB7IHJldHVybiBzaW4oMiAqIHgpOyB9CiAKLy8g55u45a++6Kqk5beu44KS6KiI566X44GZ44KL6Zai5pWwCmRvdWJsZSBlcnIoZG91YmxlIHgpIHsgcmV0dXJuIGZhYnMoeCAtIGQwKSAvIGQwOyB9CiAKLy8gRF9mCmRvdWJsZSBkaWZfZihkb3VibGUgeCwgZG91YmxlIGgpIHsgcmV0dXJuIChmKHggKyBoKSAtIGYoeCkpIC8gaDsgfQogCi8vIERfbQpkb3VibGUgZGlmX20oZG91YmxlIHgsIGRvdWJsZSBoKSB7IHJldHVybiAoZih4ICsgaCkgLSBmKHggLSBoKSkgLyAoMiAqIGgpOyB9CiAKaW50IG1haW4odm9pZCkgewogICAgZm9yKGludCBrID0gMDsgayA8IE47IGsrKykgewogICAgICAgIC8vIOWIu+OBv+W5hQogICAgICAgIGRvdWJsZSBoID0gcG93KDIsIC0zIC0gayk7CiAKICAgICAgICAvLyBEX20g44Gu6KiI566X5YCkCiAgICAgICAgZG91YmxlIHkgPSBkaWZfbSh4MCwgaCk7CiAKICAgICAgICAvLyDlgKTjgajoqqTlt67jgpLooajnpLoKICAgICAgICBwcmludGYoIiUyZDogJWUgICUuMTZsZiAgJWUgICVlXG4iLCBrLCBoLCB5LCBlcnIoeSksIGVycihkaWZfZih4MCwgaCkpKTsKICAgIH0KIAogICAgcmV0dXJuIDA7Cn0=