鉴于此方法来计算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。 –