【发布时间】:2016-06-04 06:51:51
【问题描述】:
我必须用泰勒级数计算 sin(x),直到输出有 6 个小数位。论据是一个角度。我没有实现检查小数位,我只是打印下一个值(以检查它是否工作),但在 10-20 次迭代后它显示无穷大/NaN。
我的想法有什么问题?
public static void sin(double x){
double sin = 0;
int n=1;
while(1<2){
sin += (Math.pow(-1,n) / factorial(2*n+1)) * Math.pow(x, 2*n+1);
n++;
try {
Thread.sleep(50);
} catch (InterruptedException ex) {
}
// CHECKING THE PRECISION HERE LATER
System.out.println(sin);
}
}
方程式:
【问题讨论】:
-
你为什么要这样做?代码应该是数字近似值吗?然后你可能会检查你的小数,如你所说。
-
这就是问题所在。任务:实现一个 sin(x) 方法,该方法用 6 位精度的泰勒级数计算 sin(x)。
-
代码有效吗?发布每次迭代的结果、输入值和输出。前 9 次迭代后的值是否错误?也许 10 次迭代太多了,不要在一行中写公式,你不能调试它们,为每个术语使用一个变量:比如 double divisor = factorial(2 * n +1);此外,一些数学概念在计算机程序中效果不佳。所以你可能已经了解了如何解决这个数字。
-
你的问题在哪里?我在您发布的值中没有看到 NaN,后来又删除了。,只需进行收敛检查,经过 10 次迭代后,您就可以在示例中准备好,当然 FredK 的答案是专业的。但首先尝试让您的解决方案发挥作用。正如您在 FredK 的回答中看到的那样,您的幼稚解决方案在数值上不太适合。有自己的课程“数值数学”处理这些事情。
-
提普。 diff = newSin - oldSin; while( Math.abs(diff) > 1E-7) { 做你的代码 }
标签: java trigonometry taylor-series