例如:178.125
(1)先把浮點數分別把整數部分和小數部分轉換成2進制
整數部分用除2取余的方法,求得:10110010
小數部分用乘2取整的方法,求得:001
合起來即是:10110010.001
(2)轉換成二進制的浮點數,即把小數點移動到整數位只有1,即為:1.0110010001 * 2^111,111是二進制,由于左移了7位,所以是111
把浮點數轉換二進制后,這里基本已經可以得出對應3部分的值了
(3)數符:由于浮點數是正數,故為0.(負數為1)
階碼 : 階碼的計算公式:階數 + 偏移量, 階碼是需要作移碼運算,在轉換出來的二進制數里,階數是111(十進制為7),對于單精度的浮點數,偏移值為01111111(127)[偏移量的計算是:2^(e-1)-1, e為階碼的位數,即為8,因此偏移值是127],即:111+01111111 = 10000110
尾數:小數點后面的數,即0110010001
小數點前面的1去哪里了?由于尾數部分是規格化表示的,最高位總是“1”,所以這是直接隱藏掉,同時也節省了1個位出來存儲小數,提高精度
現代計算機中,一般都以IEEE 754標準存儲浮點數
對于不同長度的浮點數,階碼與小數位分配的數量不一樣
對于32位的單精度浮點數,數符分配是1位,階碼分配了8位,尾數分配了是23位。
對于64位的單精度浮點數,數符分配是1位,階碼分配了11位,尾數分配了是52位。
一、十進制小數轉二進制小數
0.125
用乘2取整 順序排列 的方法,求得:0.001
0.125 *2 = 0.25======取出整數部分0
0.25 * 2 = 0.5======取出整數部分0
0.5 * 2 = 1======取出整數部分1
二、二進制小數轉十進制小數
0.001 = 1 * 2^(-3) = 0.125
0.1101 = 1 * 2^(-1) + 1 * 2^(-2) + 1 * 2^(-4) = 0.5 + 0.25 + 0.0625 = 0.8125
十進制小數轉二進制,在計算機中如何存儲?
比如178.125
(1)先把浮點數分別把整數部分和小數部分轉換成2進制
178 / 2 = 89 ======余數0
89 / 2 = 44 ======余數1
44 / 2 = 22 ======余數0
22 / 2 = 11 ======余數0
11 / 2 = 5 ======余數1
5 / 2 = 2 ======余數1
2 / 2 = 1 ======余數0
1 / 2 = 0 ======余數1
整數部分用除2取余 逆序排列的方法,求得:10110010
小數部分用乘2取整的方法,求得:001
合起來即是:10110010.001
(2)轉換成二進制的浮點數,即把小數點移動到整數位只有1,即為:1.0110010001 * 2^111,111是二進制,由于左移了7位,所以是111
把浮點數轉換二進制后,這里基本已經可以得出對應3部分的值了
(3)數符:由于浮點數是正數,故為0.(負數為1)
階碼 : 階碼的計算公式:階數 + 偏移量, 階碼是需要作移碼運算,在轉換出來的二進制數里,階數是111(十進制為7),對于單精度的浮點數,偏移值為01111111(127)[偏移量的計算是:2^(e-1)-1, e為階碼的位數,即為8,因此偏移值是127],即:111+01111111 = 10000110
尾數:小數點后面的數,即0110010001
小數點前面的1去哪里了?由于尾數部分是規格化表示的,最高位總是“1”,所以這是直接隱藏掉,同時也節省了1個位出來存儲小數,提高精度
所以在計算機中存儲為 0 10000110 0110010001
如何根據結果反推?
10000110 - 01111111 = 111 (之前左移的現在右移7位)
尾數加1為1.0110010001 右移7位 10110010.001 = 10110010 + 0.001 = 178 + 0.125 = 178.25
補充:
如果是0.15625 轉化二進制為0.00101,要右移3位為1.01,所以階數-3
偏移量 = -3 + 127 = 124,二進制為0111 1100,
1.01尾數為01
所以二進制存儲 0 01111100 01 后邊還有21位0
參考:
https://www.cnblogs.com/hkaren/p/11621849.html
https://mp.weixin.qq.com/s/M2m3haos2OebXyXFzTc_6A