2011-09-19 35 views
2

我有一個Java程序,我必須做的功課,這裏是我必須使用的公式:picture of formula。對不起,我不是以英語爲母語的人,我不知道這個公式的名字。爲這個數學計算有更好的解決方案嗎? (Java)

我已經寫了這個解決方案:

/* Check: 
* if: j<=3: 
* 
* 1/1+sqrt2=0,414213562 
* 1/sqrt2+sqrt3=0,317837245 
* 1/sqrt3+sqrt4=0,267949192 
*  res= 0,9999999 =~1.0 
*/ 
double sum = 0; 
for (int j = 2; j <= 624; j++) 
{ 
    sum += 1/((Math.sqrt(j) + Math.sqrt(j + 1))); 
} 
double res = 0; 
res = (double)1/(1 + Math.sqrt(2)) + sum; 

System.out.println("Result is: " + res); 

我已經檢查的程序j=2j=3,它給了正確的結果(1.0左右)。所以我認爲它運作良好。但是,當我試圖達到j<=624,我的結果是:24.000000000000014

我怎樣才能使結果將在我的計劃24.0,而不是24.000000000014?

2.這個數學公式有更好的解決方案/源代碼嗎?這個公式的英文名字是什麼?

+2

+1將其列爲作業,但將來請使用作業標籤。 – Rob

+0

@blaces:您的鏈接給我安全錯誤:「服務器的證書與主機名不匹配。」您的電腦管理員需要修復此問題。 – rossum

回答

6

歡迎來到浮點運算的世界。除非您可以使用代數來重寫公式,否則使用更少的術語或更快速地收斂,您的運氣不好 - 浮點計算從不確切並累積錯誤,正如您可以從示例中看到的那樣。 (在這種情況下的具體提示:您的術語的格式爲X k = 1 /(sqrt(k)+ sqrt(k + 1))嘗試乘以分子和分母sqrt(k + 1 ) - sqrt(k))

+3

我明白了。並且謝謝你乘以分子和分母 – blaces

0

第一個問題:使用Math.round(double)函數,它返回double的最接近的整數。

您還可以使用Math.floor(double)來獲取小於雙精度值的最接近的整數 或math.ceil(double),它返回大於double的最接近的整數。

+0

不是要返回一個整數,重點是要返回儘可能接近預期的結果。如果將系列運行到623而不是624,則不會得到整數結果。 –

+0

我明白... – Sonkey

0

對於java計算,您必須使用BigDecimal。

+1

-1:BigDecimal沒有內建的sqrt()操作;它應該怎麼知道要使用多少個小數位? –

+0

在BigDecimal上查看srt的帖子:http://stackoverflow.com/questions/1384919/are-there-libraries-for-square-root-over-bigdecimal;在所有情況下使用循環中的雙打,即使添加也會導致精確度損失,但BigDecimals – rmk

+0

並非如此,我不同意您的回覆評論。除非BigDecimal能夠從字面上處理無限精度,否則你是錯的。 如果是這樣,請將sqrt(2)打印爲BigDecimal並讓我知道您的計算機打印它需要多長時間。 :P。 –

相關問題