學習筆記:浮點數的表示方法,區別long和double

浮點數的表示方法

IEEE754浮點數的表示方法:N = (-1)^s x m x 2^e,其中s爲符號位,m是尾數位,e是指數位。code

種類 符號位 指數位 尾數位
float 第31位(佔1bit) 第30-23位(佔8bit) 第22-0位(佔23bit)
double 第63位(佔1bit) 第62-52位(佔11bit) 第51-0位(佔52bit)

對於單精度浮點數(float)來講,符號位一位,指數位8位,尾數23位。指數可以表示的指數範圍爲-128~127,尾數爲23位。內存

float和double的精度是由尾數的位數來決定的。浮點數在內存中是按科學計數法來存儲的,其整數部分始終是一個隱含着的「1」,因爲它是不變的,故不能對精度形成影響。it

  • float:2^23 = 8388608,一共七位,這意味着最多能有7位有效數字,但絕對能保證的爲6位,也即float的精度爲6~7位有效數字;
  • double:2^52 = 4503599627370496,一共16位,同理,double的精度爲15~16位。

其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。(指數二進制轉換爲十進制)table

  • float的範圍爲-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38.
  • double的範圍爲-2^1024 ~ +2^1024,也即-1.79E+308 ~+1.79E+308.

具體計算公式N = (-1)^s x m x 2^e,以float爲栗子,但s=0,m=23,e=8時:class

+1.1111111111111111111111 x 2^127(小數點後面23個1,因爲尾數的範圍1~2,其最高位總爲1,故只需存取小數部分,因此小數爲是23位1),約等於2 x 2^127=3.4 x 10^38。負數亦然。二進制

long和double的區別

long表示的是一個整型的數據,在不一樣系統或語言定義可能不一樣,在內存32位或64位,即表示的是一個有32/64位二進制數表示的一個整數,最大爲 2^63-1.float

但double不同,表示的是浮點數,以EEE754浮點數表示方法爲:N = (-1)^s x m x 2^e,其範圍和精度是由其指數和位數決定的。所說的32位或64位是指該浮點數的符號位+指數位+尾數位.方法

二者在表示形式就不同,而不能簡單地根據數據所佔位數去比較它們的大小。數據

補充:理解32位系統和64位系統tab

32位系統CPU一次可處理32位數據,即一次處理4個字節;64位系統CPU一次可處理64位數據,即一次處理8個字節。

x86與x86-64有什麼區別呢?x86指的是通常意義上的32位Intel處理器;而x86_64 則是通常意義上的64位Intel處理器。

相關文章
相關標籤/搜索