2

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++;
}
4

3 に答える 3

5

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);
} 
于 2008-10-27T17:59:42.360 に答える
3

いくつかのアドバイス:

  • term=0で開始します。正規のMacLaurin展開も
  • サイクリング中にパワーと階乗を計算します(つまり、各ステップでそれらを更新します)。おそらく問題はpow()またはfactorial()内にあります。

編集。提案:k番目の項を計算したら、次の方法で(k + 1)番目の項を計算できます。

  • (-1)を掛ける
  • sinOf^2を掛ける
  • (2k + 2)(2k + 3)で割る

このようにして、累乗と階乗の計算を完全に回避できます。

于 2008-10-27T17:53:41.187 に答える
0

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
}
于 2008-10-27T18:43:16.423 に答える