浮点数计算
浮点数
单精度浮点数共 32 位 = 1符号位[31] + 8指数位[23-30] + 23有效数字位[0-22]
双精度浮点数共 64 位 = 1符号位[63] + 11指数位[52-62] + 52有效数字位[0-51]
指数偏移量(exponent bias),因为浮点数的指数是无符号数,而且指数有正有负,为了使指数能表示正数和负数设置了指数偏移量,小于指数偏移量的为负,反之为正。
指数偏移量 = 2^(指数位-1)-1。
单精度浮点数的指数偏移量为127(0111 1111)
双精度浮点数的指数偏移量为1023(011 1111 1111)
将十进制小数转换成浮点数
- 将十进制小数转换成二进制
1.1 转换整数部分(除2)
整数部分除2保留余数,结果继续除2直到结果为0,将所得的余数从后往前依次拼接起来就是二进制数。
6 / 2 = 3 余 0
3 / 2 = 1 余 1
1 / 2 = 0 余 1
∴ 6 => 110
1.2 转换小数部分(乘2)
小数部分乘2保留结果的整数部分,结果的小数部分继续乘2直到结果的小数部分为0,将所得的整数部分从前往后依次拼接。
0.8125 * 2 = 1.625 整数 1 小数 0.625
0.625 * 2 = 1.25 整数 1 小数 0.25
0.25 * 2 = 0.5 整数 0 小数 0.5
0.5 * 2 = 1.0 整数 1 小数 0
∴ 0.8125 => 0.1101
- 确定符号位、指数位和有效数字位
2.1 符号位 1 表示负数,0 表示正数
2.2 将二进制小数保留一位整数,小数点左移n位,指数为+n,小数点右移n位,指数为-n,指数位为偏移量+指数
2.3 保留一位整数之后的小数部分就是尾数(二进制数因为保留一位整数之后,整数部分始终为1)。有效数字位为尾数后面补零
- 得出结果
将符号位、指数位(偏移量+指数)、有效数字位依次拼接起来就是
例如:-12.75 转换成单精度浮点数
- 将十进制小数转换成二进制:-1100.11
1.1 转换整数部分(除2):-1100
1.2 转换小数部分(乘2):0.11
- 确定符号位、指数位和有效数字位:-1.10011
2.1 符号位:1
2.2 指数位:127 + 3 = 128 + 2 = 1000 0000 + 10 = 1000 0010
2.3 有效数字位:100 1100 0000 0000 0000 0000
- 得出结果:1 1000 0010 100 1100 0000 0000 0000 0000
将浮点数转换成十进制小数
- 先确定符号位、指数位、有效数字位
先根据浮点数位数 确定是单精度还是双精度,然后确定符号位、指数位、有效数字位
- 确定符号、指数和小数
符号位为1则为负数,反之为正数
指数 = 指数位 - 偏移量
小数 = 有效数字位去掉右端的0
- 得出结果
小数部分 + 1得到尾数
指数为+n则小数点右移n位反之左移n位得到二进制小数。
将二进制小数转换成十进制小数