興味深い質問があります。 Tatarizeと同様、これは宿題回避ではないことを願っています。
このコードは、すべての角度が0〜90度の場合、絶対精度が+/- 0.000 000 1になるために必要な用語の数を示しています。
最大パワータームはx^k/kの違いになります!その結果に。 だから
x^k/k! < 1/10^7
ここでxはそうラジアンでのx〜1.57ラドの最大値です。 これは、13までの級数だけが0.000 000未満の最終項を与えることを意味します1。
残念ながら私のPCは高齢(32ビット)で、13を計算しようとしています!オーバーフローを引き起こします。だから私は、十分な精度がパワー13
mがために必要な最高のパワーである
Sin x = x - x^2(x/3! - x^2(x/5! - x^2(x/7! - . . . - x^2(x/(m-1)!- x^2(x/m!)
前に獲得された場合はおそらくいくつかの効率を失うことなく、階乗オーバーフローを回避し、停止を許可する角度が小さい場合や、Horner methodビットを適応させます所望の絶対精度。
Sin x = x + Sum { iTerm(i) * x^2/(i * (i-1)) }
iTerm(0) = x and iTerm(n) = - x^2 * iTerm(n-1)/(i*(i-1)
PS - なぜ私たちは数学スタック取引所外の数学の書式を使用することはできませんか? これは方程式を書く方がはるかに明確になります。
public class TrigByPoly
{
// No constructor used.
public static void main(String[] args)
{
double x0 = 0,
x1 = Math.PI/12,
x2 = Math.PI/6,
x3 = Math.PI/4,
x4 = Math.PI/3,
x5 = Math.PI/2;
double sinx0 = SinByPoly(x0),
sinx1 = SinByPoly(x1),
sinx2 = SinByPoly(x2),
sinx3 = SinByPoly(x3),
sinx4 = SinByPoly(x4),
sinx5 = SinByPoly(x5);
System.out.println("Sin(0) to 7 decimal places is : " + sinx0);
System.out.println("Sin(15) to 7 decimal places is : " + sinx1);
System.out.println("Sin(30) to 7 decimal places is : " + sinx2);
System.out.println("Sin(45) to 7 decimal places is : " + sinx3);
System.out.println("Sin(60) to 7 decimal places is : " + sinx4);
System.out.println("Sin(90) to 7 decimal places is : " + sinx5);
}
public static double SinByPoly(double x)
{
int i = 0; // Polynomial order indicator.
double x2 = x * x,
iTerm,
sinx = 0;
if (x < 0.0084) // Limiting angle for Sinx = x to 10^-7 precision.
sinx = x;
else
{
sinx = x;
iTerm = sinx;
i = 3;
do
{
iTerm = - x2 * iTerm/(i * (i - 1));
sinx += iTerm;
i = i + 2;
} while (i < 14 && (iTerm > 0.0000001 || -iTerm > 0.0000001));
}
return sinx;
}
}
OUTPUT
======
Sin(0) to an absolute precision of 1.0E-7 is : 0.0
Sin(15) to an absolute precision of 1.0E-7 is : 0.2588190618109834
Sin(30) to an absolute precision of 1.0E-7 is : 0.4999999918690232
Sin(45) to an absolute precision of 1.0E-7 is : 0.7071067829368671
Sin(60) to an absolute precision of 1.0E-7 is : 0.8660254450997811
Sin(75) to an absolute precision of 1.0E-7 is : 0.9659258210120795
Sin(90) to an absolute precision of 1.0E-7 is : 0.999999943741051
あなたのwhile条件は、あなたが望むものではないため、あなたは無限ループしています。おそらく、2つの異なる目的のために変数を再利用しようとしていて、失敗しています。このインターラクションで行った変更を保存し、その状態でdetla値をテストするデルタ変数を作成します。 – HopefullyHelpful