2

我必须在我的 Comp Sci 课程中从头开始创建 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++;
}
4

3 回答 3

5

就像 Federico 指出的那样,问题可能出在您的 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);
} 
于 2008-10-27T17:59:42.360 回答
3

一些建议:

  • 从 term = 0 开始。典型的 MacLaurin 展开式也可以
  • 在您骑车时计算幂和阶乘(即在每一步更新它们)。也许问题出在 pow() 或 factorial() 之内。

编辑。建议:一旦你计算了第 k 项,你可以通过以下方式计算第 (k+1) 项:

  • 乘以 (-1)
  • 乘以 sinOf^2
  • 除以 (2k+2)(2k+3)

通过这种方式,您可以完全避免计算幂和阶乘。

于 2008-10-27T17:53:41.187 回答
0

至于 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
}
于 2008-10-27T18:43:16.423 回答