それで、テイラー近似を使って cos(x) を計算するプログラムを作成しようとしています。
プログラムは非常に単純です。ユーザーはパラメーター x (x はラジアン単位の角度) と float ε (cos(x) の値の精度) を入力します。
基本的に、プログラムがしなければならないことは、この合計を計算することだけです: x^0/0! - x^2/2! + x^4/4! - x^6! + x^8/8! - ...、項が ε よりも小さくなるまで、つまり cos(x) の値は、精度の範囲内になります。
コードは次のとおりです。
#include <stdio.h>
/* Calculates cos(x) by using a Taylor approximation:
cos(x) = x^0/(0!) - x^2/(2!) + x^4/(4!) - x^6/(6!) + x^8/(8!) - ... */
int main(void)
{
int k; // dummy variable k
float x, // parameter of cos(x), in radians
epsilon; // precision of cos(x) (cos = sum ± epsilon)
sum, // sum of the terms of the polynomial series
term; // variable that stores each term of the summation
scanf("%f %f", &x, &epsilon);
sum = term = 1, k = 0;
while (term >= epsilon && -term <= epsilon)
// while abs(term) is smaller than epsilon
{
k += 2;
term *= -(x*x)/(k*(k-1));
sum += term;
}
printf("cos(%f) = %f\n", x, sum);
return 0;
}
最初は、別の変数 "fact" で階乗を計算して解決しようとしましたが、ε の妥当な大きな値でもオーバーフローが発生しました。
これを解決するには、前の項に -x² / (k(k - 1)) を掛けて、反復ごとに k を 2 ずつ増やして、次の項を取得できることに気付きました。これで問題は解決すると思いましたが、やはりうまくいきません。
プログラムは正常にコンパイルされますが、たとえば、次のように入力した場合:
3.141593 0.001
出力は次のとおりです。
cos(3.141593) = -3.934803
...そしてそれは明らかに間違っています。誰かが私を助けることができますか?