[ quoted from ] 情報演習 課題C-B-1(※)一部抜粋・改変
以下のプログラムは、正の実数xを入力とし、関数f(x)=log(x)について、dを十分小さくしたとき、(f(x+d)-f(x-d))/2dが(1-log(x))/x^2に収束することを、実際に計算して確かめるためのプログラムである。プログラム中do〜whileループで、(f(x+d)-f(x-d))/2dの値が収束するまで、dの値を小さくする。
しかし、以下のプログラムにはいくつか間違いがある。そのため、コンパイルが成功しない、またコンパイルが成功するように修正してもうまく計算を行うことができない。これらの間違いを訂正し、正しいプログラムに修正せよ。
#include <stdio.h> #include <math.h> double calculate(double x); double f(double x); double df(double x); int main(void) { double x; printf("Input x (> 0.0): "); scanf("%lf", x); if ( x > 0.0) { calculate(x); } else { printf("x must be greather than 0.\n"); } } double calculate(double x) { double d; // delta double a, b; d = d/2.0; a = (f(x+d)-f(x-d))/2.0*d; do { d = d/2.0; b = a; a = (f(x+d)-f(x-d))/2.0*d; printf("d=%lf, (f(x+d)-f(x-d))/2d=%lf\n", d, a); } while (fabs(b-a)!=0.0); printf("\n[Result]\n"); printf("(f(x+d)-f(x-d))/2d converged to %lf\n", a); printf("df(x)= %lf\n", df(x)); } double f(double x) { return (log(x) / x); } double df(double x) { return ((1.0 - log(x)) / (x*x)); }