2016-02-22 117 views
2

我必須用泰勒級數計算sin(x),直到輸出有6位小數位。爭論是一個角度。我沒有實現檢查小數位,我只是打印下一個值(以檢查它是否工作),但在10-20次迭代後,它顯示無窮大/ NaN。泰勒級數 - 計算sin(x)直到6位數精度

我的想法有什麼問題?

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

公式:

enter image description here

+0

爲什麼你想這樣做?應該把代碼作爲一個數字aproximation?然後你的probaly應該檢查你的小數,如你所述 – AlexWien

+0

這是問題任務: 實施sin(x)方法計算sin(x )與泰勒的6位數字精度系列<<這就是我所有 系列是無限的,我認爲這'6位數'是循環結束條件 – Qbix

+0

而且代碼工作?,發佈結果,輸入值和每次迭代的輸出。前9次迭代後的值是否錯誤?可能10次迭代要多,並且不要在一行中寫公式,您不能調試它們,對每個項使用一個變量:如double divisor = factorial(2 * n +1);進一步的一些數學概念在計算機程序中效果不好。所以你可能已經得到了一些如何解決這個問題的信息。 – AlexWien

回答

1

不要使用階乘和權力來計算每個術語!你會很快溢出。 只要知道每個下一術語是-term * X * X /((N + 1)*(N + 2)),其中通過2每個​​術語n的增加:

double tolerance = 0.0000007; // or whatever limit you want 
double sin = 0.; 
int n = 1; 
double term = x; 
while (Math.abs(term) > tolerance) { 
    sin += term; 
    term *= -((x/(n+1)) * (x/(n+2))); 
    n+= 2; 
} 
+0

sin(Math.PI)給出3.14 Oo:D Bug – Qbix

+0

應該是Math.abs(term)>容忍 – FredK

+0

@Qbix如果你爲自己的作業複製他的解決方案,考慮改變tolerancde的等級,你可能無法回答他爲什麼用7作爲最後一個數字。是我的第一個問題,對你。 – AlexWien

-1

問題:

NAN錯誤通常是一個非常大的數字,東西,如果你把2個數字,可以happend但除數是非常小的,或零。

解決方案

這是因爲你的階乘的數量變得越來越溢出,後來又在某些時候,你是通過零再次 分,如果你的階乘作爲參數的int,然後改變它,例如,一個BIgInterger對象。

+0

是的,這是正確的,經過10-20次迭代後,但0-10輸出是隨機的,這就是爲什麼我問什麼是錯的:( – Qbix

+0

使用BIgInteger不是一個解決方案,可能作者應執行「檢查小數」,因爲他陳述。 – AlexWien

0

要在添加到應答由@ Xoce(和@FredK)提供,請記住你正在計算McLaurin系列(Taylor的特例約x = 0)。雖然這對於大約在pi/2之內的值會很快收斂,但在階乘x以上的數值爆炸之前,您可能無法收斂數字。

我的建議是用實際泰勒級數關於其確切值是已知的(即,pi/2最近倍數,不只是零,而且絕對不收斂檢驗的sin(x)最接近的值!