catalog
浮点数表示
实数的二进制bit表示
我们这里不考虑 (符号位)!!!, 即仅针对 (正实数)的情况
因为, 正负仅仅是一个符号的问题, 令X>0, 即: X_10进制 = X_2进制, 对应负数的情况: -X_10进制 = -X_2进制
其实很简单, [c, b, a] .(小数点) [x, y, z]
(小数点左侧为: 整数, 则: {a, b, c, ...} 依次为: {2^0, 2^1, 2^2, 2^3, ...} (等比递增)
)
(小数点右侧为: 小数, 则: {x, y, z, ...} 依次为: {2^-1, 2^-2, 2^-3, ...} (等比递减)
)
比如, 二进制为: 1011.1011
, 他的十进制为: x.y
- 看整数部分:
1011 = 1 + 2 + 0 + 8 = 11 (看二进制从右往左, 得到的十进制是从小到大)
, 即x = 11
- 看小数部分:
1011 = 1/2 + 0 + 1/8 + 1/16 (看二进制从左往右, 得到的十进制是从大到小)
, 即y = 11 / 16 = 0.6875
故, 1011.1011
<=> 11.6875
对于: 11.6875
, 他的二进制表示是什么呢? 要怎么求呢?
(注意, 我们这里说的是: 二进制表示, 而非 计算机里的bit位排布)
(因为, 二进制表示 != bit位
; 比如-11
, 他的二进制表示为: -1011
, 而他的bit位 却不是-1011
)
- 该数包括 (整数
11
) 和 (小数0.6875
), 即 (十进制整数 -> 二进制) 和 (十进制小数 -> 二进制)
十进制整数 -> 二进制
我们这里不考虑 (符号位)!!!, 即仅针对 (正整数)的情况
因为, 正负仅仅是一个符号的问题, 令X>0, 即: X_10进制 = X_2进制, 对应负数的情况: -X_10进制 = -X_2进制
即, 比如 11 = 1011, 则: -11 = -1011
方法为: (模2) -> (除2 下取整
), 不断重复该过程
x = 11
0. 11 % 2 = 1 ' 得到的1, 为(最低位)的bit '
11 / 2 = 5 ' 把11 更新为 5 '
1. 5 % 2 = 1
5 / 2 = 2 ' 把5 更新为 2 '
2. 2 % 2 = 0
2 / 2 = 1 ' 把2 更新为 1 '
3. 1 % 2 = 1
1 / 2 = 0 ' 把1 更新为 0 '
直到, 该数 变成 0; 依次得到的结果是: 1 1 0 1 (顺序为: [低位 -> 高位]
你需要将他(反过来), 即1 0 1 1
是 11的二进制
即, 不断重复: (%2获得结果 -> /2更新), 直到变成0; 最后将得到的结果, (逆序)
十进制小数 -> 二进制
我们这里不考虑 (符号位)!!!, 即仅针对 (正小数)的情况; 这里的小数, 是:0.xxx (即是个<1的小数)
因为, 正负仅仅是一个符号的问题, 令X>0, 即: X_10进制 = X_2进制, 对应负数的情况: -X_10进制 = -X_2进制
即, 比如 0.6875 = 1011, 则: -0.6875 = -1011
方法为: (*2 -> 拿掉整数部分)
11 = 0.6875
0. 0.6875 * 2 = 1.375
拿掉(整数部分): 1.375 -> 0.375, 得到: 1
1. 0.375 * 2 = 0.75
拿掉(整数部分): 0.75 -> 0.75, 得到: 0
2. 0.75 * 2 = 1.5
拿掉(整数部分):