(註:本文假設讀者瞭解電腦科學的基礎知識)
許多電腦科學專業的新手程式設計師/學生會問一些與他們所學的電腦科學領域相關的常見問題。大多數初級課程都是從現代計算機中使用的數制開始的,包括二進位制、十進位制、八進位制和十六進位制。這些是計算機數字格式,是計算機(或計算器和任何其他型別的數字計算機)中數值的內部表示形式。這些值儲存為“位分組”。
正如我們所知,計算機用一組二進位制數字來表示資料(即1和0的組合,例如,1111代表十進制中的15),因此,教授用於表示動態值範圍的不同數字格式是有意義的,因為它們構成了任何操作中計算/數字處理的基本塊。一旦在課堂上定義了數字系統(通常很糟糕),學生們就會傾向於使用同一型別(即浮點算術)中具有一定精度和數字範圍的不同數字格式。因此,他們被迫學習某些型別之間的細微差別。最常用的兩種資料型別是Float和Double,雖然它們的目標是相同的需求(即浮點運算),但它們的內部表示和對程式中計算的總體影響卻有很大的不同。不幸的是,許多程式設計師錯過了平面資料型別和雙資料型別之間的細微差別,最終在不應該首先使用它們的地方誤用了它們。最終導致專案其他部分的計算錯誤。
在本文中,我將透過C程式語言中的程式碼示例告訴您float和double之間的區別。我們開始吧!
Float和Double是用於浮點算術運算的資料表示形式,想想你在數學類中計算的十進位制數,例如20.123、16.23、10.2等,它們不是整數(即2、5、15等),因此它們需要考慮二進制中的分數。因為所得的十進位制數(即20.123、16.23等)不能容易地用普通二進位制格式(即整數)表示。Float和Double的主要區別在於前者是單精度(32位)浮點資料,而後者是雙精度(64位)浮點資料型別。Double被稱為“Double”,因為它基本上是Float的雙精度版本。如果你計算的是一個巨大的數字(想想數字中成千上萬的0),那麼不準確度在雙精度中會更小,你不會損失太多的精度。
最好使用程式碼示例進行詳細說明。下麵是透過C語言提供的數學函式對Float和Double的操作:
#包括<;標準h>;
int main(){
浮點數1=1.f/82;
浮點數m2=0;
對於(int i=0;我<;738; ++(一)
num2+=num1;
printf(“%.7g\n”,num2);
雙num3=1.0/82;
雙num4=0;
對於(int i=0;我<;738; ++(一)
num4+=num3;
printf(“%.15g\n”,num4);
getchar();
}
它列印以下內容:
9.000031
8.99999999999983
在這裡,您可以看到Float和Double在精度上的細微差別給出了完全不同的答案,儘管Double似乎比Float更精確。
以下是C中sqrt()函式的示例:
#包括<;標準h>;
#包括<;數學.h>;
int main(){
浮點數1=sqrt(2382719676512365.1230112312);
雙num2=sqrt(2382719676512365.1230112312);
printf(“%f\n”,num1);
printf(“%f\n”,num2);
getchar();
}
它提供以下輸出:
48813108
48813109.678778
在這裡,你可以看到雙精度的答案有更好的精度。
總之,浮點運算最好使用Double,因為C中的幾個標準數學函式都是在Double上執行的,而現代計算機對雙浮點運算的速度和效率都非常高。這就減少了對使用浮點的需求,除非您需要操作大量的浮點數(想想數字中有數千個0的大型陣列),或者您操作的系統不支援雙精度浮點,如許多GPU、低功耗裝置和某些平臺(ARM Cortex-M2、Cortex-M4、,等等)還不支援Double,那麼應該使用Float。此外,需要記住的一點是,某些gpu/cpu在浮點處理中工作得更好/更高效,比如在向量/矩陣的計算中,因此您可能需要檢視硬體規範手冊/文件,以便更好地決定應該為特定機器使用哪一個。
在針對現代計算機的程式碼中,很少有理由使用Float而不是Double。Double中的額外精度可以減少但不能消除舍入錯誤或其他可能導致程式其他部分出現問題的不精確性。許多數學函式或運算子轉換並返回Double,因此不需要將數字轉換回Float,因為那樣可能會丟失精度。對於浮點運算的詳細分析,我強烈建議您閱讀這篇很棒的文章(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).
所以…簡而言之:
應該使用Float的位置:
在本文中,我強調了Float和Double之間的區別,以及在特定的地方應該使用哪一個。可以說,在大多數地方盲目地使用Double更好,特別是當你瞄準現代計算機時,因為使用雙浮點演算法導致效率低下的可能性非常小。如果您有任何問題,那麼您可以在下麵的評論部分提問!
單人床和雙人床有什麼區別嗎?從尺寸上看,我們不得不說沒有。全床和雙人床都是尺寸相似的床,比單人床大。此外,它們的寬度足以容納兩個人。單人床或雙人床的標準尺寸為54“x75”(137釐米×191釐米)。 這些床或床墊...
...va是一種流行的程式語言,用於開發各種應用程式。Java的一個優點是它支援面向物件程式設計(OOP)。使用OOP,可以使用物件對程式或軟體進行建模。類被用作建立物件的藍圖。有必要在程式設計中儲存資料。儲存資料的保留記...
...裝類。 目錄 1. 概述和主要區別 2. 什麼是整數 3. 什麼是浮動 4. 整數與浮點的相似性 5. 並排比較-以表格形式顯示整數與浮點 6. 摘要 什麼是整數(integer)? Integer是Java中的一個包裝類。對應的資料型別是int。它用於將int資料型別轉...
關鍵區別–浮動與雙精度 在程式設計中,需要儲存資料。資料儲存在儲存器中。儲存資料的記憶體位置稱為變數。每個記憶體位置都可以儲存特定型別的資料。每種資料型別的記憶體大小不同。在Python等程式語言中,程式設...
大號雙人床 大號和雙人間的區別,顧名思義,是在尺寸上。單人床、雙人床、大床、特大號床、超級大床和加州大床都用來表示不同尺寸的被子/床和床墊。床是家庭中最重要的傢俱之一,與放鬆有關。因此,人們對它的設計...
雙人房與雙人房 既然雙人間和雙人間都意味著兩間,那是否意味著雙人房和雙人房沒有區別?現在,如果你經常光顧酒店,因為你的工作或商業目的,你一定注意到酒店裡有各種不同型別的房間,它們被稱為單人房、雙人房...
Uber和Lyft是兩個非常相似的服務。這兩款應用都是“共享乘車”應用,你可以在**上開啟它們,讓司機用自己的車快速乘車。這些年來,這兩項服務變得越來越相似,但它們之間仍然存在一些重大差異。 uber和lyft的工作原理 這...
新裝置帶來了新的問題,Chromecast(和其他流媒體HDMI棒)的興起讓更多的人好奇他們是否應該在不用它的時候拔掉它。讓我們把事情弄清楚,並在這個過程中儘量減少流媒體的麻煩。 Dear How-To Geek, I’ve been hearing all this stuff lately...
...天的問答環節是由SuperUser提供的,SuperUser是Stack Exchange的一個分支,是一個由社群驅動的問答網站分組。 圖片由CLUC(Flickr)提供。 問題 超級使用者讀者Flare Cat想知道不同型別的LAN IP地址代表什麼?: I have seen LAN IP addresses in the...
...的事情,不小心改變了我們正在處理的microsoftword文件中一個重要元素的樣式。如果是小東西,修補起來可能很容易,但如果不是那麼簡單呢?今天的超級使用者問答文章提供了一些快速簡便的方法來幫助修補讀者的microsoftword文...