浮点数转二进制规则学习记录

浮点数的存储格式

目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和小数来表示,底数定为2——即把一个浮点数表示为小数乘以2的指数次方再添上符号。float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。具体如下:
float类型:单精度浮点值,1位符号,8位指数,23位小数。
float
double类型:双精度浮点值,1位符号,11位指数,52位小数。
double

转换规则

将浮点数的整数部分和小数部分分别转换为二进制并按照科学计数法表示,然后按照相应的存储格式排列。
浮点数精度问题:小数部分在转换时的实际位数按照相应的精度标准来处理。例如float类型转换时小数部分转换后的实际位数为float精度标准(24)减去整数部分转换的二进制数所占的位数。
隐藏位技术:科学计数法的最高位1不写入内存。
阶码:因为指数可以为负,为了便于计算,规定都先加上偏置量Bias=2^(k-1)-1,其中k是指数位数。对于float类型k=8即Bias=127,对于double类型k=11即Bias=1023.
注意:(1)如果只有小数部分,那么需要右移小数点。(2)十进制在转换为二进制的时候可能会不准确,如2.2,而double类型的数据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题,对于能够用二进制表示的十进制数据,如2.25,这个误差就会不存在。(3)当阶码为全0且尾数也为全0时,表示的真值为零,结合符号位为0或1,有正零和负零之分。当阶码为全1且尾数为全0时,表示的真值为无穷大,结合符号位为0或1,也有+∞和-∞之分。

Python算法实现

struct.pack(fmt,v1,v2,...).encode('hex')

参数说明:fmt – 格式字符,f和d对应C中float和double类型。v1,v2… – 需要转化的数值,浮点数对应Python中float类型。
注意:格式字符fmt中<和>分别对应字节顺序中小端序大端序,最低有效字节(类似于最低有效位)在最高有效字节的前面,则称小端序;反之则称大端序。

猜你喜欢

转载自blog.csdn.net/weixin_44256803/article/details/85319585
今日推荐