2009-09-16 63 views
2

在程序設計競賽,浮點運算相關的問題說:「錯誤是答案必須小於1E-6」或「答案一定是高達6位小數正確的」。這是否意味着我可以不用擔心精度執行上FP變量計算,僅在打印的同時,我應該寫這樣如何處理浮點運算精度用C

printf("%.6lf",a); 

我是否理解正確嗎?上面的兩個引號是否意味着同樣的事情? 在其中一個問題中,當我使用雙數組並執行一些計算並打印了一個數組元素時。它印上「-0.000000」。這是什麼意思? 但是,當我使用的載體在C++等

vector<double> arr(10,0.0); 

相同的計算印刷 「0.000000」。爲什麼會有這樣的差異?

+0

保持精度儘可能你必須優化您的計算(例如不具有非常不同的指數值加號,不乘過小或大的數字。在一起,而不是乘少數大的,如果可能的話,排序細分所以子結果的絕對值大約是1.0 ..等等) – Spektre 2013-08-20 13:19:15

回答

0

塊引用做到以上2個報價意味着一樣?

顯然不是。 1-e6表示你的答案必須在0.000001的範圍內。 6位精度意味着即使答案是12345689,12345678也是正確的。其差值遠大於.0000001。現在如果你的答案是.100001(正確答案是.100000),那麼它們是一樣的。

+0

所以,我只是做雙數據類型和計算報告,答案在6位小數precsion時我使用%.6lf。這是否正確或是否有任何舍入函數將其四捨五入到小數點後6位 – avd 2009-09-16 12:47:06

+0

措辭是6位小數,這通常意味着正確的小數點 – Mark 2009-09-16 13:25:01

+0

精度是stonemetal描述後6位是6個顯著數字 – Mark 2009-09-16 13:26:20

2

如果您需要在精度6位小數,至少使用一個雙。取決於你正在做的浮點計算的多少,蝴蝶效應可以很容易地影響你的答案。

浮點數IEEE標準已經簽署零。 see here

1

在浮點運算符號是不是數字的一部分,所以這兩個-0和0

+0

但是爲什麼它只顯示一個簡單的數組和向量不相同 – avd 2009-09-16 12:39:29

+0

不應該有任何差異。 – 2009-09-16 14:01:45

+1

我們需要看到更多的代碼加上知道磨你的編譯器檢查的printf做究竟出6位小數 – Mark 2009-09-16 14:56:16

2

的1E-06的誤差爲0.000001,而影響第6位小數,但我認爲只有一個僧侶會堅持兩個引號之間有區別。 (我是一個,它需要一個知道一個)

有關保留精度到6位小數的要求可能意味着要提醒大家,計算的精度只有之多至少計算中使用的準確數字。

所以,你無法計算圓的周長6位小數,如果你使用3.1416作爲PI,無論你如何準確地測量半徑

2

準確度不僅取決於所使用的類型,還取決於您如何計算東西

比如你要計算這個:

1E9 + 1E9 - 1E9

正確的答案應該是1E9,但在訂貨時加入1E9丟失執行1E9並給出0

使用float或double是不夠的,一定要得到正確的6位數字。你必須估計每一步可能出現的錯誤。

你應該閱讀有關Numerical analysis

1

沒有辦法知道是否浮動是足夠的,或者如果你必須使用一個布爾值,甚至更好的精度;一些算法會迅速破壞精度。例如通過總結漸近系列計算的值,可以達到一個點,其中任何太低精度(它是5或15位)簡單地鼓起。您可以閱讀有關此類信息,例如in this blog post

而在博客中,爲什麼他的「浮動」(Python的浮動=雙精度)失敗,但HIST自己的例程做呢?他的例程不僅可以使用任意精度,而且可以在錯誤增加時監視計算以增加精度。只有這樣你才能確定。