鑑於此方法來計算x的餘弦:增加餘弦的準確性
public static double myCos(double x){
double alteSumme, neueSumme, summand;
int j = 0;
neueSumme = 1.0;
summand = 1.0;
do
{
j++;
summand *= -x * x/j;
j++;
summand /= j;
alteSumme = neueSumme;
neueSumme += summand;
} while (neueSumme != alteSumme);
return alteSumme;
}
我不得不從實數變換域到區間[0,PI/2]爲準確的結果。
所以,我寫這個方法:
public static double transform(double x){
x = x%(2*Math.PI);
if(!(0<=x&&x<Math.PI)){
x = -(x+Math.PI);
}
if(!(0<=x&&x<Math.PI/2)){
x = -(x-2*Math.abs(x-Math.PI/2));
}
return x;
}
應該在三個步驟的工作。
將域從reals轉換爲[0,2PI)。
將域從[0,2PI)轉換爲[0,PI)。
從[0,PI)變換域至[0,π/ 2]
但不知它產生錯誤的結果。
你能幫我找到我的錯誤嗎?
編輯
public class Main {
public static double transform(double x) {
x = x % (2 * Math.PI);
if (!(0 <= x && x < Math.PI)) {
x = -(x + Math.PI);
}
if (!(0 <= x && x < Math.PI/2)) {
x = -(x - 2 * Math.abs(x - Math.PI/2));
}
return x;
}
public static double myCos(double x) {
x = transform(x);
double alteSumme, neueSumme, summand;
int j = 0;
neueSumme = 1.0;
summand = 1.0;
do {
j++;
summand *= -x * x/j;
j++;
summand /= j;
alteSumme = neueSumme;
neueSumme += summand;
} while (neueSumme != alteSumme);
return alteSumme;
}
public static void main(String[] args) {
int n = 0;
int k =50;
for (double y = k * Math.PI; y <= (k + 2) * Math.PI; y += Math.PI/4) {
System.out.println(n + ":" + y + ": " + myCos(y) + " " + Math.cos(y));
n++;
}
}
}
這是您應通過驗證每個問題來解決的問題類型階段,而不是張貼到計算器。使用調試器或添加日誌輸出來驗證映射函數的結果 - 如果它運行不正常,請找出原因。 –
我運行了你的代碼,它工作正常,所以我刪除了我的答案。有一些不準確的地方,但是當將'x = transform(x);'添加到'myCos'函數的頂部,並且將x從'-200 * Math.PI + Math.PI/3'迭代到'200 * Math .PI + Math.PI/3'在2 * Math.PI'的步驟中,結果在小數點後保持精確到小數點後13位。 – Kenney
@Kenney:我不明白。例如:Pi/3 + 15Pi用我的方法產生約1,但它應該產生-0.5。 –