题
我必须在我的计算机科学课程中从头开始创建 sin 函数,并且我即将找到解决方案。但是,我仍然遇到一些问题。如果我输入 0.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++;
}
解决方案
像费德里科指出的那样,问题可能出在你的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);
}
其他提示
一些建议:
- 从 term = 0 开始。正则麦克劳林展开式也确实
- 计算幂和阶乘 当你骑自行车时 (即在每一步更新它们)。也许问题出在 pow() 或 Factorial() 内。
编辑。建议:计算完第 k 项后,您可以通过以下方式计算第 (k+1) 项:
- 乘以 (-1)
- 乘以 sinOf^2
- 除以 (2k+2)(2k+3)
这样你就可以完全 避免 幂和阶乘的计算。
就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
}
不隶属于 StackOverflow