2.1 拓展小数二进制以及精度损失原因

1. 二进制小数

// 10.42
// 整数部分: 10 / 2 = 5 余 0
// 5 / 2 = 2 余 1
// 2 / 2 = 1 余 0
// 1 / 2 = 0 余 1 // 商得到0为止
// 整数部分二进制: 1010

// 小数部分:乘以2,得到0, 取整, 小数得到0为止
// 0.42 * 2 = 0.84 0
// 0.84 * 2 = 1.68 1
// 0.68 * 2 = 1.36 1
// 0.36 * 2 = 0.72 0
// 0.72 * 2 = 1.44 1
// 0.44 * 2 = 0.88 0
// 0.88 * 2 = 1.76 1
// 0.76 * 2 = 1.52 1
// 0.52 * 2 = 1.04 1
// 0.04 * 2 = 0.08 0
// 0.08 * 2 = 0.16 0
// 0.32 * 2 = 0.64 0
// 0.64 * 2 = 1.28 1
// 0.28 * 2 = 0.56 0
// 0.56 * 2 = 1.12 1
// 0.12 * 2 = 0.24 0
// 0.24 * 2 = 0.48 0
// 0.48 * 2 = 0.96 0
// 0.96 * 2 = 1.92 1
...

// 整体表示 : 1010.01101...

// 概念
// 1.float 四个字节 32位
// 2.最高位 表示正负号 0-正 1-负
// 3.紧跟着8位表示指数位,取值范围 0-255 由于指数也有正负号,指数位需加127 实际取值范围:-127 + 128
// 剩下23位是有效数字,有效数字最高位都是1,所以省略掉。补充后面的有效数字

// 实例
// 1010.01101... 小数点左移三位 1.01001101..
// 正数所以最高位为0
// 小数点左移三位:指数位为127+3=130 二进制10000010
// 补充有效数字,有效数字小于23剩余的补0 01001101...

0100 0001 0010 0110 1.......

// 转为十进制
// 假设 将 ... 都看为0, 损失部分精度
0100 0001 0010 0110 1000 0000 0000 0000

// 1 - 符号位是0, 表示正数
// 2 - 指数位 0001 0010 0 130 - 127 = 3
// 3 - 有效数字 1.01001101

// 正数,小数点向右移动 1010.01101
// 正数部分: 02^0 + 12^1 + 0*2^2 + 1 * 2^3 = 10
// 小数部分:0/(2^1) + 1/(2^2) + 1/(2^3) + 0/(2^4) + 1/(2^5) = 0+0.25 + 0.125 + 0 + 0.03125 = 0.40625

// 最后 10.40625 由于实例中舍去有效数字过多,导致精度损失非常大
// 所以说,浮点型损失精度,是丢弃掉23位有效数字后面的数字,造成精度损失

// 对于double 1个符号位(S) 11个指数位(E) 52位表示有效数字(M)
// 指数的范围 -2^10-1 至 2^10 偏移量 = 实际偏移量 + 2^10-1

你可能感兴趣的:(2.1 拓展小数二进制以及精度损失原因)