IEEE754浮点数转换
作者:互联网
本次探究一下十进制单精度浮点数转换为二进制形式的方式
探究原因
由于目前大部分计算机存储数据是以二进制的形式储存,那么会在输入十进制数据时转化为二进制,然而在由于字节数有限,再转化过程中可能会导致数据丢失而精度下降。探究转换方式,易于理解为什么会精度下降。
必要知识
对于32位的单精度浮点数,数符分配是1位,阶码分配是8位,尾数分配是23位。
简单来说,数符表示符号:“0”为正,“1”为负;阶码存储指数部分;尾数存储小数部分。
转化过程
不妨以5.75为例子
1.整数部分
整数部分除以2取余
5除以2,商2余1,将余数放在左面,即“1”;
以上次的商作被除数,再次取余,商1余0,将余数放在左面,即“01”;
重复上步,商0余1,即“101”.
商0后便可停止取余。
2.小数部分
小数部分乘2取整
0.75乘2,得1.5,取整数1放在右面,剩下0.5,即“1”;
重复上步,得1.0,取整数1放在右面,剩下0.0,即“11”;
剩下0后便可停止取整.
3.拼接
则转化后的值为101.11。
4.科学计数
将小数点移动至最高整数位的1后面,移动后为1.0111,移动的位数为十进制下的2,则可以写成
1.0111*2^2
那么十进制下的5.75便是二进制下的1.0111*2^2.、
那这个1.0111*2^2具体是如何储存的?
储存方法
这里先给表格
数符 | 阶码 | 尾数 | |||||||||||||||||||||||||||||
1.数符
这是个正数,那么数符便要填0
数符 | 阶码 | 尾数 | |||||||||||||||||||||||||||||
0 |
2.阶码
阶码 = 阶数 + 偏移量
阶数可以简单理解为小数点移动的位数,即2.
偏移量为2^(e - 1) - 1,其中e为阶码的位数,再该次转换中e = 8,故偏移量为127.
故该数的阶码为127 + 2 = 129.
129转换为二进制,为10000001.
注意:由于阶数可以是负数,这时候的算出来的阶码不足八位,需要在高位即左边补0至八位。
数符 | 阶码 | 尾数 | |||||||||||||||||||||||||||||
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
3.尾数
尾数储存科学计数法中的小数部分。
在二进制的科学计数法中,整数部分总是1,故该部分不会储存在尾数中,可以留出空间提高小数精度。
小数部分为0111,不够23位则在后面补0
数符 | 阶码 | 尾数 | |||||||||||||||||||||||||||||
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
那这便是5.75储存在计算机中的格式。
这里提供了一个工具,我们不妨验证一下
看来结果是对的。
那同理,
对于161.875,其转化为二进制,是1.0100001111*2^7,储存形式为
数符 | 阶码 | 尾数 | |||||||||||||||||||||||||||||
0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
数符 | 阶码 | 尾数 | |||||||||||||||||||||||||||||
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
参考资料
1.十进制浮点数转换成IEEE754标准的32浮点数的二进制格式 - 立志做一个好的程序员 - 博客园 (cnblogs.com)
2.浮点数的十进制和二进制转换(详细例子解答)_*Temporary的博客-CSDN博客_float二进制转十进制
3.如何手算十进制浮点数转二进制(IEEE754-32位)浮点数 - 简书 (jianshu.com)
4.十进制浮点数转换为二进制数以及存储方式_willingtolove的博客-CSDN博客_十进制浮点数转二进制
5.浮点数的二进制表示(IEEE 754标准) - 知乎 (zhihu.com)
工具
标签:阶码,转换,二进制,浮点数,IEEE754,尾数,数符,十进制 来源: https://www.cnblogs.com/Joci-zhuoxue/p/16692232.html