質問
Comp Sciクラスでsin関数をゼロから作成する必要があり、解決策に近づいています。ただし、まだいくつかの問題があります。 .5PI以下の値を入力すると機能しますが、それ以外の場合は間違った結果が得られます。これが私がこれまでに持っているコードです:
double i=1;
double sinSoFar = 0;
int term = 1;
while(i >= .000001)
{
i = pow(-1, term + 1) * pow(sinOf, 2*term-1) / factorial(2*term-1);
sinSoFar=sinSoFar + i;
term++;
}
解決
Federicoが指摘したように、問題はおそらくfactorial()またはpow()にあります。 Mathクラスで提供されるpow()関数とこのfactorial()で関数を置き換えて、正常に機能するテストを実行しました:
public static long factorial(long n) {
if (n < 0) throw new RuntimeException("Underflow error in factorial");
else if (n > 20) throw new RuntimeException("Overflow error in factorial");
else if (n == 0) return 1;
else return n * factorial(n-1);
}
他のヒント
いくつかのアドバイス:
- term = 0で開始します。標準のMacLaurin展開も同様です。
- サイクリング中にパワーと階乗を計算する (つまり、各ステップでそれらを更新します)。たぶん問題はpow()またはfactorial()内にあります。
編集。提案:k番目の項を計算したら、次の方法で(k + 1)番目の項を計算できます。
- (-1)による乗算
- sinOf ^ 2による乗算
- (2k + 2)(2k + 3)で割る
この方法で、べき乗と階乗の計算を完全に回避できます。
0-1 / 2PI以外の値については、範囲内の値からすべて計算できます。
// First, normalize argument angle (ang) to -PI to PI,
// by adding/subtracting 2*PI until it's within range
if ( ang > 1/2PI ) {
sin = sin ( PI - ang );
}
else if ( ang < 0 ) {
sin = -1 * sin( -1 * ang );
}
else {
// your original code
}
所属していません StackOverflow