最近因为要解析一个二进制文件,里面的整型字符当然好理解,但是对于浮点型数据就有问题了。
分析了好久,后来知道浮点数据基本按照ieee标准进行存储。
接着就开始学习IEEE754标准,找相关资料。
英文太烂,只能看中文的。 花了很多时间终于还是找到了一篇比较完整基础的教程(我认为),每一步的换算过程。
现在按自己理解的记录一下,以后就不需要重头学起了。
例子123.456
整数部分直接转换 123 = 1111011
小数部分按以下格式转换
0.456 = 01110100101111000 110
换算公式为:
0.456 0.5 (1/2^1) 0.456 < 0.5 0 0.456-0.5*0 = 0.456
0.456 0.25(1/2^2) 0.456 > 0.25 1 0.456-0.25*1 = 0.206
0.206 0.125 0.206 > 0.125 1 0.206-0.125*1 = 0.081
0.081 0.0625 0.081 > 0.0625 1 0.081-0.0625*1 = 0.0185
0.0165 0.03125 0.0165 < 0.03125 0 0.0185-0.03125*0 = 0.0185
0.0165 0.015625 0.0165 > 0.015625 1 0.0185-0.015625*1 = 0.002875
0.002875 0.0078125 0.002875 < 0.0078125 0 0.002875-0.0078125*0 = 0.002875
0.002875 0.00390625 0.002875 < 0.00390625 0 0.002875-0.00390625*0 = 0.002875
0.002875 0.001953125 0.002875 > 0.001953125 1 0.002875-0.001953125*1 = 0.000921875
符号位 阶码(整数的移位:6+127) 尾数
0 10000101 11101101110100101111000
上面是整数部分的浮点数据
对于小于1的浮点数据(0.465)首先将它转换一下。
0.465 = 1.823 * 2(-2)
整数部分: 1 = 1
小数(按照上面的公式) 0.823 = 110100101 (太长了,有兴趣自己去算,这里以0代替,会有点误差)
符号位 阶码(整数的移位:-2+127) 尾数
0 01111101 11010010100000000000000 = 0x3EE94000
最后推荐一个转换的网站输入16进制获得数据。0x3EE94000 得到的浮点数据为:0.45556640625