簡體   English   中英

在Java中創建自定義的Sin()函數

[英]Making a custom Sin() function in Java

我必須在Comp Sci類中從頭開始創建sin函數,我正在接近解決方案。 但是,我仍然遇到一些問題。 如果我輸入的值為.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++;
}

就像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);
} 

一些建議:

  • 從term = 0開始。規范的MacLaurin擴展也是如此
  • 騎車時計算功率和階乘(即在每一步更新它們)。 也許問題在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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM