2013-07-07 14 views
2

我正在研究萊布尼茲問題,如https://www.hackerrank.com/challenges/leibniz這裏所示。其計算1-1/3 + 1/5-1/7 + 1/9 + ...序列中的每個元素可以定義爲(i)=( - 1)^ i /(2 * i + 1)從0開始。如何提高由於C++分區中精度不足導致的結果精度

問題要求從第一項到第n項加上並輸出結果。我的程序通過了基本的測試用例。但在其他情況下失敗。

我想我的程序錯誤是由於數字足夠大時的精度造成的。

任何人都可以提供一種方法來提高結果的精度嗎?

double leibnitz(int n) { 
    double res = 0.0; 
    for (int i = 1; i <= n; i++) { 
     res += 1.0/(2 * i - 1) * (i % 2 == 1 ? 1.0 : -1.0); 
    } 
    return res; 
} 
+1

什麼錯?你沒有提到究竟出了什麼問題,或者什麼樣的輸入觸發了這種錯誤的行爲。 – Borgleader

+0

Ace。什麼是問題? –

+0

這可能會有所幫助http://stackoverflow.com/questions/14637621/c-calculating-more-precise-than-double-or-long-double?rq=1 –

回答

2

n開始循環並倒計時。

原因是可以以更高的精度添加0附近的小數,因爲前導零將在浮點數的指數部分中表示(因此名稱爲「浮點」),使得更多的尾數可用。所以你可以用更精確的小部分總和來處理1。

循環應該是這樣的:

for (int i = n; i >= 1; i--) { 
    res += 1.0/(2 * i - 1) * (i % 2 == 1 ? 1.0 : -1.0); 
} 

的jsfiddle用簡單的問題,以說明排序可以在這裏做一個區別:

http://jsfiddle.net/smt56/1

BTW:你應該能夠縮短表達爲

res += ((i % 2) * 2 - 1)/(2.0 * i - 1) 
+0

我真的很感激你的幫助。它似乎通過這種方式提高了精度。但是當n很大時,例如n等於10^7時,它仍然沒有給出足夠準確的答案。所以它在提交中仍然失敗。 – witrus

+0

你嘗試使用長雙重? –

+0

是的,這不起作用 – witrus