小數的儲存跟其他型別資料的儲存方式有很大的不同,我們通常用科學技術法來表示很大或者很小的數,即用乙個尾數(mantissa
),乙個基數(
base
),乙個指數(
exponent
)以及乙個表示正負的符號來表達實數。
比如123.456
用十進位制科學計數法可以表達為
1.23456
× 10^2
,其中1.23456
為尾數,
10為基數,
2為指數。
浮點數利用指數達到了浮動小數點的效果,從而可以靈活地表達更大範圍的實數。
浮點數是將特定長度的連續位元組的所有二進位制位分割為特定寬度的符號域,指數域和尾數域三個域,其中儲存的值分別用於表示給定二進位制浮點數中的符號,指數和尾數。這樣,通過尾數和可以調節的指數(所以稱為"浮點"
)就可以表達給定的數值了。
具體的格式:
符號位階碼
尾數長度
float 1
8 23 32
double 1
11
52 64
我們都知道浮點數在32
位機子上有兩種精度,
float佔32
位,double佔64
位。 將乙個小數寫成二進位制數具體步驟:小數點左邊整數部分的數正常計算,小數部分的數乘以2,把個位數記錄下來,就是小數部分的二進位製碼,大多數情況下,小數部分是不可能算的盡的。
舉個例子:
0.5 = 0.100 0000 0000 0000 0000 0000
123.456 = 111 1011.0111 0100 1011 1100 01...
最後要寫成
科學計數法,整個一共是23位,如果為float型的話,第乙個數必須為1,有時候把1省掉是為了增加小數字的數提高精度
ieee
規定,浮點標準用
v = (-1)s×
m×2e
形式來表示乙個數,其中:
s 是符號
(sign),m 是有效數(significand) ,指數
2 的e 次冪。
float
型別的偏置量
bias = 2
k-1-1
= 28-1
-1 = 127
,
拿123.456 = 111 1011.0111 0100 1011 1100 01...來說,寫成科學計數法是:1.1110 1101 1101 0010 1111 00*2^2,補上因為左移作為小數部分的
2位(也就是科學技術法的指數),因此偏置量為
127 + 2=129
,這裡的階碼就是129
10,二進位制就是:1000 00012。
因此,拼接起來後: 為
1000 0001
01001100110011001100110|←
8位→||←------------- 23位
-------------→
|加起來就是31位,還差一位符號位就是32位了。
double型的也同樣如此,只不過位數不一樣,double的階碼為11位,尾數為52位。
小數在記憶體中的儲存表示
整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。首先,要學會十進位制小數與二進位制小數之間的轉換。1 二進位制小數轉化為十進位制小數 比如把二進位制小數110.11轉化為十進位制小數,步驟如下 2 十進位制小數轉化為二進位制小數 方法是這樣的 先分別把十進位制小數的整數部分和小...
小數在記憶體中的儲存表示
整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。首先,要學會十進位制小數與二進位制小數之間的轉換。1 二進位制小數轉化為十進位制小數 比如把二進位制小數110.11轉化為十進位制小數,步驟如下 2 十進位制小數轉化為二進位制小數 方法是這樣的 先分別把十進位制小數的整數部分和小...
小數在記憶體中的儲存表示
整數在記憶體中的儲存方式比較簡單,我們來看看小數在記憶體中的儲存方式。首先,要學會十進位制小數與二進位制小數之間的轉換。1 二進位制小數轉化為十進位制小數 比如把二進位制小數110.11轉化為十進位制小數,步驟如下 2 十進位制小數轉化為二進位制小數 方法是這樣的 先分別把十進位制小數的整數部分和小...