能不能用 double 去取代 float?Milo Yip2017-10-11 17:26:52

float 通常是使用 IEEE 754 標準中的 binary32 表示,以二進位制方式、用32位儲存浮點數。

double 通常是 binary64。

其實 IEEE 754 標準中還有較少用到的 binary16(常稱為 half)、binary128(quadruple)和 binary256(octuple)。在 x86 架構上 long double 通常是 80 位的浮點數(不是 IEEE 754 標準)。

用更高精度就可表示更廣範圍、更精確的數字,但要付出儲存空間和運算速度的代價。

如果只是幾個變數、做幾個計算可能問題不大,但如果考慮海量資料和計算量,就要選擇最合適的型別。

能不能用 double 去取代 float?王晉瑋2017-10-13 01:29:45

這個問題下面一半答案在說吞吐量,另一半在說延遲

當討論“效能”的時候,有時候必須得分成延遲(處理單個任務的時間)和吞吐量(單位時間處理的任務量)兩方面來討論

簡單結論是,現代常規的計算硬體(桌面/移動端CPU,GPU)上面double和float的延遲差不多,吞吐量float高一倍

如果你的程式碼就是想拿個實數簡單地算來算去,那用double還是用float效能都差不多

如果你的程式碼裡面有大規模的實數運算,例如向量求和/矩陣乘/歸約,請根據精度需求能用float就別用double,再找一個靠譜的最佳化的較好的庫如Eigen / OpenBLAS / MKL / ArmComputeLibrary / CUDA全家桶

影響延遲的是關鍵路徑的耗時,影響吞吐量的是堆料的規模。CPU/GPU/記憶體發展到現在,基本上延遲改進的已經非常緩慢了,仍在快速提高的是吞吐量。處理器搞那麼多級流水線和那麼寬的SIMD,CPU堆那麼多核心,GPU搞那麼多的stream processor,多半都是提升吞吐量但是不降低延遲的方案。甚至DDR記憶體一代一代往上更新也是頻寬在快速提升而訪問延遲改進的不多。

double和float的關鍵路徑耗時差不多,所以它們的延遲差不多;但是float位寬只有double的一半,大多數硬體裡面float和double的datapath又是幾乎完全複用的,也即堆的料一樣多,所以float的吞吐量通常是double的兩倍,現今主流的Intel和ARM CPU都是如此。當然也有些硬體上面它們datapath不完全複用,比如Nvidia的有些GPU,double的吞吐量只有float的幾十分之一,移動端的有些GPU乾脆都不支援double

不過倒是還沒見過double吞吐量超過float吞吐量的一半的硬體。。。

能不能用 double 去取代 float?譚偉2017-12-15 10:15:26

基本贊同 @迪迦奧特曼 的回答。

關於float和double的“快慢”,大家問的時候,這個“快慢“可能意思是latency,也可能意思是throughput。所以一定要搞清楚問的是什麼。

latency:double和single arithmetic在CPU上latency(也就是cycle)是一樣的。

throughput來說,因為CPU上SIMD unit的寬度是一定的,所以double(佔用相當於float兩倍的寬度)的throughput是single的一半。在GPU上,因為double unit DP和single unit SP的比例不一樣,這個throughput的比例也不一定,如Volta上是1:2,K40上是1:3,而Titan X等消費卡則完全沒有DP unit就不能做double運算。

關於是否能取代,答案是看具體的應用。舉個例子,1+ 2^24 和2^24 兩個整數,用float表示的話,它們的表示是一樣的。而用double可以精確表示這兩個不同的數字。這種rounding error造成了浮點數運算是non associative的,也就是(a+b)+c與a+(b+c)不一樣。如果這是你可以接受的,那float就是夠用的。 (反過來說,對有些應用來說,double也是不夠的,需要long double甚至更多)

實踐上,對於精度要求較高的操作,如矩陣求逆、解線性方程組等,一般要求double。(事實上,超級計算機的benchmark linpack就是比用double精度來解線性方程組的浮點 throughput——flops)。而隨機梯度下降等演算法,用single甚至half precision也可以(因為反正這個梯度也是在隨機選取的樣本上的了)。

能不能用 double 去取代 float?s-quark2018-01-05 18:18:56

對於初學者來說,建議只使用double,不要糾結double和float的區別。除非筆試要考,要求你背一些書本上的東西,上機一律用double不會有問題。學習程式設計要首先學會把要求的程式編寫出來,之後才是那些細節問題。

float會比double計算速度快,佔用空間少,但是精度比較低。如果不是運算瓶頸,那麼使用double就好了,不需要擔心因為float精度不夠啊所產生的問題。

能不能用 double 去取代 float?pansz2018-11-09 15:05:27

歷史原因,double之於float就好像int之於short。

正如short這個型別在現在依然存在,但絕大多數情況下都會用int而不會用short。float這個型別雖然存在,但除了特定專業領域,普通程式設計領域你就應該只用double。

當然,在特定場合為了效率,仍然有short用武之地。

同理,特定場合下,為了效率,也會有必須用float的情形。

對於題主來說,你可以大膽的在所有場合預設用double替代float。不用擔心,因為當你遇到必須用float的場合時,你一定會知道的。

比如你做遊戲,突然發現現有程式碼全用的float,現成的api介面也都用的float,你自然知道現在該用float。

又或者進行某些運算量很大對效能有嚴格要求但精度要求卻非常低的計算領域,編寫這些專業領域的程式碼時,你發現效能不能滿足要求,你可能需要用得到float。

除了那些情況以外,確實可以只用double。