十进制转二进制
比如 10.13
1. 整数部分(除2取余,逆序排列)
具体做法是,用2去除十进制数的整数部分,可以得到一个商和一个余数;再用2去除商,又会得到一个商和余数;继续用2去除商,一直到商为0时停止;然后逆序将余数排列起来,得到二进制数。
10.13的整数部分是10
10 / 2 = 5……0
5 / 2 = 2……1
2 / 2 = 1……0
1 / 2 = 0……1
逆序排列之后, 得到 10 的二进制为 1010
2. 小数部分(乘2取整,顺序排列)
具体做法是,用2乘以十进制数的小数部分,可以得到一个积;将积的小数部分取出,再乘以2,又得到一个积;继续将积的小数部分取出,乘以2,直到积的小数部分为0,或者达到所要求的的精度(浮点数位数有限,不能精确的表示出所有实数,所以当位数超出格式允许的位数时,会将剩余的数字舍入,即舍入误差。);经上面所有积的整数部分,顺序排列起来,得到二进制数。
10.13的小数部分是 0.13
0.13 * 2 = 0.26 整数部分为0,小数分布0.26
0.26 * 2 = 0.52 整数部分为0,小数分布0.52
0.52 * 2 = 1.04 整数部分为1,小数分布0.04
0.04 * 2 = 0.08 整数部分为0,小数分布0.08
0.08 * 2 = 0.16 整数部分为0,小数分布0.16
0.16 * 2 = 0.32 整数部分为0,小数分布0.32
0.32 * 2 = 0.64 整数部分为0,小数分布0.64
0.64 * 2 = 1.28 整数部分为1,小数分布0.28
0.28 * 2 = 0.56 整数部分为0,小数分布0.56
.
.
.
顺序排列之后, 得到 0.13 的二进制为 0.001000010……
如果是 0.25
0.25 * 2 = 0.50 整数部分为0,小数分布0.50
0.50 * 2 = 1.00 整数部分为1,小数分布0.00
顺序排列之后, 得到 0.25 的二进制为 0.01
所以10.13的二进制为 1010.001000010…… ; 10.25的二进制为 1010.01
二进制转十进制(按权相加法)
具体做法是,先将二进制数写成加权系数展开式,然后按照十进制加法规则求和。
比如 1010.01
1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 + 0*2^-1 + 1*2^-2
= 8 + 0 + 2 + 0+ 0 + 1/4
= 10.25
再比如 1010.001000010
1*2^3 + 1*2^1 + 1*2^-3 + 1*2^-8
= 8 + 2 + 1/8 + 1/256
= 10 + 33/256
= 10.12890625
参考: The Floating-Point Guide - What Every Programmer Should Know About Floating-Point Arithmetic