浮點數的表示方法
IEEE754浮點數的表示方法:N = (-1)^s x m x 2^e
,其中s為符號位,m是尾數位,e是指數位。
種類 | 符號位 | 指數位 | 尾數位 |
---|---|---|---|
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”,由於它是不變的,故不能對精度造成影響。
- float:2^23 = 8388608,一共七位,這意味着最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字;
- double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。
其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值范圍。(指數二進制轉換為十進制)
- 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時:
+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.
但double不一樣,表示的是浮點數,以EEE754浮點數表示方法為:N = (-1)^s x m x 2^e
,其范圍和精度是由其指數和位數決定的。所說的32位或64位是指該浮點數的符號位+指數位+尾數位
.
兩者在表示形式就不一樣,而不能簡單地根據數據所占位數去比較它們的大小。
補充:理解32位系統和64位系統
32位系統CPU一次可處理32位數據,即一次處理4個字節;64位系統CPU一次可處理64位數據,即一次處理8個字節。
x86與x86-64有什么區別呢?x86指的是一般意義上的32位Intel處理器;而x86_64 則是一般意義上的64位Intel處理器。