能不能用 double 去取代 float?

時間 2021-05-11 18:41:25

1樓:小白神馬好吃嗎

引用《C++ Primer 第五版中文版》原文

"執行浮點數運算選用double,這是因為float通常精度不夠而且double和float的計算相差無幾。事實上,對於某些機器來說,雙精度運算甚至比單精度還快,long double提供的精度一般情況下是沒有必要的,況且他帶來的執行時消耗也不容忽視。"

2樓:芋頭

各有使用優點,float比double足足少了一半的資料量,在一些對儲存空間、傳輸速率要求較高的場合,甚至對浮點數使用int量化,而連float都不用;只有對精度要求較高時,才使用float,double一般不用

3樓:

opengl遊戲

雖然某些平台相容了double,但考慮本身多平台適應特性,還是都用float。

特別是使用著色器,算float極快。

4樓:

根本就沒很多人說的這麼複雜。即便是在科學計算中,你對精度要求沒那麼高,float 就是快就是快就是快,這時該用 float 就用。

說真的,像某些還在用 p ≤ 0.05 的學科,用 double 簡直就是浪費

5樓:阿虛

浪費多少記憶體空間啊。能用short就用short,用不了short再用float,實在不行用double,金融類直接以分為單位用整數。

怪不得現在電腦越來越卡,原來是程式設計師越來越懶。社會責任感焉在?

6樓:丁一帆

amd 和 Nv的大部分遊戲顯示卡計算浮點 float是double 的10-16倍

要是你買不起ttv 還是用float吧

7樓:軍軍

離開需求,不要談設計

小資料量運算儲存通訊不會有明顯差別

量大就不同了,運算儲存通訊都會翻倍,在採集分析檢測試驗類的軟體中,都是致命的

8樓:葉飛影

時代真的進步了,

過去我們想的是:能不能用half去取代float?

現在你們想的是:能不能用double去取代float?

什麼是代溝?這就是代溝!

9樓:張若閒

想要大房子肯定要多花錢,錢少就湊合著整個小點的,反正沒那麼多人,也夠住。

住大房子的要麼人多小的住不開砸鍋賣鐵也得住大房子,要麼就是非常豪不差錢想住就住

double就是大房子,float就是小房子

10樓:

看行業吧,要說速度肯定是float快。不過因為截斷誤差的原因,float誤差比較大。

科學計算領域經常是全部用double。

11樓:Liberty.goni

具體情況具體分析。

有些系統架構對double比較友好(速度比float快);大部分系統double和float的速度相差無幾。

有些架構就是用double表示float的。

具體情況具體分析,反正用double絕對沒錯,即使它不一定是最優解。

12樓:法靈

對於初學者而言,double和float自然是沒什麼區別。上機考試啥的都直接用double正常是沒什麼問題的。但是注意到在精度要求不那麼高的情況下,float會顯得更加經濟。

13樓:愛吃牛排

看精度,選變數.精度越高的變數算的越慢,儲存空間越大,所以當你不需要那麼高精度的時候就沒有必要用double.比如3D引擎裡一般float就夠了,因為CPU的SSE指令集和顯示卡也只是32位float而已,你記憶體裡有64位精度也沒卵用.

如果需要根據需求變換精度,可以用typedef來統一替換,或者用模板<>來方便變更.

比如://保留其中乙個

//typedef float real;

typedef double real;

vector3 v1;

vector3 v2;

vector3 v3;

14樓:王欽石 s-quark

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

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

15樓:馬遙

簡單來說:可以,沒問題。

被迫用回float的原因是引擎或者庫裡面別人用的都是float,自己也慢慢就改回float了,否則反而麻煩。比如Unity的Vector3就是三個float。

16樓:White

emmm 大佬們說的雲裡霧裡的看不懂。

高中的時候也經常想這個問題。

題主剛學float和double的用法,你們給他講到物理層效率什麼的題主真的能看得懂嘛........

如果只是初高中OI相關的話,我一直都是用double來著。

然後如果是大學僧的話可以考慮問一下自己的授課老師,說不定能得到更好的解釋。

17樓:譚偉

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

關於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也可以(因為反正這個梯度也是在隨機選取的樣本上的了)。

18樓:圓胖腫

哈哈,好問題,事實上我們已經在系統範圍內推廣number型別去他媽的什麼float,double,int和long難道不都是number嘛?

真有需要的時候,我們會使用byte,而不是這些亂七八糟的什麼float之類的,還有short

再早一點什麼int8, int16, int24, int32,我天現在json為啥流行?因為json只有幾個型別:string,number,bool,null,木有了

就這麼搞行了,真有需要我們再來看怎麼優化

19樓:春程處處不飛花

double佔64bits,float佔32bits早些年,大部分cpu還是32位的時候,處理乙個32位的float剛剛好,當然是飛快的;要是處理乙個64位double,那必然是要採取某種神奇的操作,慢了不止一倍哦。

並且,cpu從記憶體抓float的時候,一次就夠了,抓個double得兩次。

所以,精度要求不高的時候,盡量用float。

然而,現在大部分的cpu都是64位的了,用double也很方便了。

20樓:Xi Yang

某些情況下,為了簡單是可以的。比如Perl總是使用平台上最高精度的浮點作為它scalar裡面的小數型別。

不過但凡你對效率有一些要求,就不能這麼替換,因為double比single的計算速度(在常見CPU上)通常都會慢一倍。然後還有快取命中、記憶體頻寬什麼的問題。

21樓:

可以,絕大多數搞應用開發的其實真不用糾結這些,基本上都是效能過剩的。

那麼啥時候不可以?等遇到double解決不了的問題的時候(你可以認為這是句廢話)。當然提前多知道點東西也是沒壞處的。

22樓:五小

多一位有多一位的用處,多一寸有多一寸的效能原因分析!

這個知識點本身就是粗看無妨,細看也是進一寸有一寸的歡喜的那種。

看了幾個大神的回答發覺我這個實用主義果然還是low到掉渣了,我還是繼續不求甚解算了。

而且你知道嗎,架構那麼多,硬體架構也那麼多,GPU shader內的也算有這型別啊。

你剛剛學就這麼被一群senior 懟真的好嗎?

還有還有,連用的語言都沒問清楚啊,怎麼C++的竟然已經開始掐架了!

23樓:喬捷

x86 CPU的標量浮點數計算float和double是用的相同的部件,所以效能上是沒差別的。但如果是SIMD向量計算,float要比double多一倍,比如SSE一次算4個float或2個double,那float的吞吐量就是double的2倍。另外,double需要更大的儲存空間,需要大量浮點資料儲存的應用,比如3D渲染,那當然是首選float的。

所以這個問題的答案是不考慮SIMD向量化也不在乎資料儲存空間的限制,在x86上用double和float基本沒區別。

24樓:左慶

結論:向量處理時float 和double才有明顯差別。

普通人寫兩個陣列相加C = A+B;

寫成for(int i = 0;i < N;i++) C[i] = A[i] + B[i];用float 和double差別不大

但是如果用SSE加速_mm_add_ps 一次能加4個float,但是只能加2個double,速度就有差別了。

25樓:王鈺Emma

這個有很多類似的問題。為什麼不用long取代int?用matrix取代vector?

全部都是效能的tradeoff啊。

殺雞用宰牛刀也是這個意思。

26樓:野龍

有一些特殊情況必須用double。例如C#的volatile。原因嘛,float是四個位元組,可以一次性讀取,因此保證能執行緒安全,double要分兩次就不可能不上鎖還執行緒安全了。

還有就是在呼叫gpu的時候,貌似並沒有double給你用。

除了這些你確定必須用float的情況,其他的愛用double就用吧,現在記憶體也沒那麼容易炸了

畢卡索鋼筆能不能用

山海move 雙十一入手的畢卡索916 價位在100元,本以為用著會比較舒心,但實際體驗非常糟心。墨水是配套送的墨水,筆尖上的墨水不容易擦乾淨,第二天開始斷墨,有事沒事就來這麼一下,100塊錢買了個寂寞,不推薦。 楊生漢 說畢卡索不好的要麼是黑要麼是水。畢卡索的筆在低價筆中是好筆了,我連自己用帶送人...

能不能用DrRacket代替GUN MIT Scheme去實現SICP中的習題?DrRacket和GNU MIT Scheme有什麼區別?

李欣宜 原PLaneT neil sicp已停止維護。建議轉SICP Collections,實現上相對更加完善一些。但與原書有點區別,比如在picture language部分對應的sicp pict collection的transform painter原型在這個包裡的原型是 transfor...

尤拉公式 e ix cosx isinx 能不能用初等的方法推導出來?

不能,事實上僅用初等的框架連e x是不是乙個定義良好的函式都說不清。更誇張一點,甚至講不清楚2 x是什麼。至於複數做指數代表的意思,等式右端已經告訴你了。 PiKaChuu 個人認為幾乎不太可能 個人理解,如果e x沒有嚴格的在非實數區域進行定義,是無法嚴格推廣到複數域的,誰告訴你x可以取複數了 要...