2009-12-08 93 views
6

是否有任何情況下使用單個數據類型而不是雙重更有意義?從我的搜索中,缺點到雙重的是它需要更多的空間,這對大多數應用程序來說都不是問題。在那種情況下,所有的浮點數都應該加倍嗎?單雙數據類型

有點背景信息: 我正在處理一個應用程序,處理大量關於座標和化學物質的數據。一些客戶已經注意到,在導入數據電子表格時,一些高精度的值會降低單個精度。

+2

「最」應用程序。可能是嵌入式系統的問題,或者您擁有數百萬雙倍的問題。 – mpen 2009-12-08 18:03:23

+1

我的經驗法則是當我有一個很好的理由(比如節省空間)時,正常使用double,float(顯然是你的單身)。 – 2009-12-08 18:26:45

回答

2

在大多數桌面應用程序中,是的。

雖然如果你有一大堆數組,那麼如果你不需要精度,那麼將其大小減半可能是有價值的。

特別是在幾乎所有的消費者桌面都有硬件完成的雙精度浮點運算。

+0

第一款Nvidia CUDA顯卡可以處理更多的單精度浮點數,而不是每秒處理雙精度浮點數。我心中沒有數字,對不起。 – 2009-12-08 18:10:23

+0

注意:普通臺式機中的Intel和AMD處理器在SSE寄存器中也有單精度算術硬件,它們也支持多個並行操作。 – deegee 2015-06-22 19:29:21

2

正如Mark在他的評論中所說的,空間可能是內存受限系統中的一個問題。您可能還想索引或排序列表,如果可以將您的值存儲爲單數,爲什麼還要加倍?

4

this .NET文章

數據類型寬度

最有效的數據類型是 那些使用本地數據寬度運行時平臺的 。在當前的 平臺上,數據寬度爲32位, 用於計算機和操作系統。

因此,Integer目前是 Basic中的最高效數據類型。接下來最好的是Long,Short, 和Byte,按效率順序排列。 可以提高 短關掉整數 溢出檢查,例如通過 設置RemoveIntegerChecks 財產的性能和字節,但是這招致 計算不正確,由於 未被發現的溢出風險。 在 運行時間內不能打開和關閉此檢查;您只能爲 應用程序的下一版本設置其值 。

如果你需要的分數值,該 最好的選擇是雙重的,因爲目前的 平臺 浮點處理器在 雙精度執行所有操作。接下來最好的是單一的 和十進制,效率依次爲 。

+1

這是說雙倍比單一更有效嗎? – Everett 2009-12-09 16:23:20

+0

是的,根據文章,從操作的角度來看(即倍增,分割等......)雙打應該更有效率。當然,正如許多其他人指出的,從內存使用的角度來看,Single更好。更重要的是,你提到客戶已經注意到精度的損失,這意味着他們想要更高的精度。所以,問題不是哪個更好?這是,爲什麼我的雙打被單打投了? – 2009-12-10 13:05:05

1

雙打需要更多的空間,但額外的精度可能或可能不需要。我在科學世界做了很多編程,浮點運算非常普遍,並且發現通常可以以兩倍或更高的精度進行計算,但將結果存儲爲單數而沒有不良影響。

請記住,一旦數字被吸入FPU中,無論如何都會將其擴展到非常高的精度。這就是說,最好在兩個精度上嘗試你正在做的任何事情,看看結果是否可比。

不幸的是,計算仍然是一門實驗科學。

+0

對於以給定精度評估任何給定表達式而引起的浮點錯誤,邊界可計算(難度很大)。 – 2009-12-08 18:19:45

0

如果你編碼的是OpenGL,那麼使用GLSingle(例如single)而不是GLDouble是正常的。在幾乎所有情況下,單精度對於大多數圖形應用來說已經綽綽有餘,並且應該會更快一些 - 儘管我承認我對最新一代GPU沒有把握。

我最喜歡的引用是單精度足以導航到月球和背部,所以在實踐中,導致一個真正的問題是不尋常的。這就是說,在大多數情況下,由於存儲價格便宜,因此現在可以達到一倍,並且不太可能出現奇數二進制到十進制問題。

2

在某些硬件上,涉及double值的算術可能需要比涉及單個值的算法更長的時間,但是最新的FPU具有單個本機數據類型(例如,x86的80位擴展浮點值),它將在內部用於無論您正在使用哪種內存數據類型,都可以進行計算。這就是說,「單精度FPU計算速度會更快」通常是而不是這是在當今大多數現代硬件上使用單精度的原因。這就是說,除了「使用更少的內存」原因在其他答案中闡述的原因之外,當涉及像SSE和AltiVec這樣的SIMD向量指令時,存在一個非常實際的原因 - 單精度似乎是兩倍快速爲雙精度,因爲指令對固定大小的向量進行操作,並且可以將單倍精度值填充到單個向量中的兩倍,處理時間通常保持不變。例如,在一個128位矢量單元能夠在2個時鐘週期內處理矢量乘法,每個時鐘可以獲得2個單精度乘法的吞吐量,而不是1倍精度,因爲您可以在矢量中使用4個單精度,而不是兩個雙打。

內存帶寬也會出現類似的影響,並且不是特定於矢量處理 - 如果您有大型雙打數組,它們不僅會佔用兩倍的空間,但可能需要長達兩倍的時間才能處理你的算法是帶寬受限的(隨着矢量處理單元尺寸的增加和延遲的降低,這種可能性越來越大)。

+0

和參考文獻:每個計算機科學家應該知道什麼是浮點算術 - http://docs.sun.com/source/806-3568/ncg_goldberg.html 浮點(來自Java編程) - http:// www.cs.princeton。edu/introcs/91float/ – mctylr 2009-12-08 20:14:09

+0

請注意,我進行了雙重檢查,AltiVec實際上僅支持SIMD的32位單精度FP值,但至少各種SSE風格絕對支持這兩者。 – BeeOnRope 2009-12-08 22:13:40