我看書發現這裡想不通,好像也沒有找到相應的解釋。求教,大一新生一枚。

類似問題

能不能用double去取代float?

http://www.zhihu.com/question/66347905?utm_source=com.miui.notesutm_medium=social (分享自知乎網)


我覺得這個問題完全是重複啊

能不能用double去取代float??

www.zhihu.com圖標

這個問題下已經有大量優秀回答,現在再問一次有什麼意義?

但是既然重定向被撤銷了……(不at了,但真想問問為什麼要撤銷?)


先說我的看法:你需要什麼就用什麼,但是不要想著讓別人也跟著用什麼。

如果我只是想在中間過程中保留小數的存在用於最後捨去,那我需要double的精度嗎?

如果我要進行科學計算,double精度都不夠,那問題是不是要改成「long double精度比double高,為什麼不用double」?

C語言有float和double,最主要當然是歷史原因,當年比較廣泛的是float——當年浮點運算都是作為開銷大的一種存在。

至於寫代碼的人為什麼用float而不是double,那就得問作者本身了,但最通常的原因就是用不上和慣性——既然float的代碼也是正常在跑,為什麼要換成double?

就算是現在,我認為也不該取消float——硬體上沒取消,作為接近硬體層的C/C++也就不該也不可能取消。

不取消了不意味著必須用float,但同樣這也不意味著必須用double。知道自己需求,知道float/double的區別(包括概念上的,硬體上的),才是最重要的。

「xxx更好更輕鬆,為什麼不去用xxx」。「更好更輕鬆」都是有代價的,只不過的確日常很多時候不重要罷了。


如果想知道更多float/double硬體上的區別,那個回答有很多優秀答案:

能不能用double去取代float??

www.zhihu.com圖標能不能用double去取代float??

www.zhihu.com圖標能不能用double去取代float??

www.zhihu.com圖標


因為空間很寶貴,包括內存和磁碟以及網路流量等等。

一個 double 佔用的空間是一個 float 的 2 倍。當數據量足夠大的時候,翻一翻可是相當可觀的。在精度允許的情況下,我們總是使用更節省空間的 float。甚至在特定領域,還會使用更小的浮點類型。例如,在 GPU 編程上 half 類型就很常見,作為比 float 還小一半的浮點類型,它在你能看到的所有遊戲大作中發光發熱。雖然精度與 double 不可同日而語,但應用在像素著色上,人眼根本無法分辨那極其微小的亮度變化。

所以,適用才是硬道理。

https://en.m.wikipedia.org/wiki/Half-precision_floating-point_format?

en.m.wikipedia.org

Minifloat - Wikipedia?

en.m.wikipedia.org圖標


絕大多數情況下不會去用float。但是呢,在某些特定場景,比如你對計算結果的精度要求不高,而內存緊張的情況下,是可以用float的,畢竟float只佔4位元組,double佔8位元組。

至於你看到書上用float,據我的經驗,這些寫書的老古董都是從上古時代過來的,在他們那個內存沒這麼大的時代,用float節省內存是正常的。


這不就是「何不食肉糜」么,沒過過節約內存和兼容cpu的日子。

double精度高的同時,內存佔用也是double的。


內存啊內存啊啊啊!!!普通程序沒問題,但如果競賽的時候限制死256M內存,而你的DP不能滾,對精度要求又不高的時候開double才是有病吧


其他回答說了內存問題。我提另一個原因。例如你在調用GPU進行運算,單精度和雙精度對於特定GPU的算力完全不同。有些GPU閹割了雙精度,會導致效率奇低。

如果是做3D實時渲染的話,你不能保證做項目的時候,你可以用最新的圖形api,如果gpu就是有些地方不讓你用雙精度,除了干瞅著還能怎麼。

而且用得到雙精度的地方實在不多,顏色數值一般沒必要這麼高,很多時候16位就夠了。

光柵化過程深度值勉強需要,但是如果真的是很大的場景,何不用logz呢,很大又有很多遮蓋的場景……盜夢空間遊戲版?星球大戰的死星?這種場合太少見了。


推薦閱讀:
相关文章