如何将浮点值转换成4字节的16十六进制数?
我写了一篇关于这个的论文。
在公司现有产品通讯协议升级过程中,涉及到浮点数的传输。传统的方法是将浮点数乘以一个整数倍数,放大到一定精度后进行舍入,将舍入后的整数传输到目的地,再将整数除以相应的倍数,恢复出真值。这种方式虽然可以避免传输过程中浮点数的运算,但是给双方都带来了计算压力。需要用乘法和除法将一个浮点数放大和缩小几倍。而且,标准的Modbus RTU协议也允许浮点运算。所以在通信中使用浮点数时,最重要的是注意浮点数在内存中的存储格式,这是双方正确分析通信数据的前提。浮点数的结构已经被IEEE委员会明确定义,现在大部分硬件厂商和编译器都采用了IEEE关于浮点数的规定。IEEE规定二进制浮点数可以用32位、64位和128位表示。对于我公司使用的研发产品和未来产品发展的预测,使用32位浮点数就足以满足数据大小和精度的要求,所以我们的通信协议中浮点数用32位二进制表示,根据IEEE的规定,32位浮点数表示为
(-1)s X be X m
在…之中
s是0或1。
b是使用的基数。
e是整数并且Emin
m表示为下面的一组数值,d0.d1d2d3d4...DP-1 (di是一个整数,0
对于32位二进制表示的浮点数,b的值为2,Emin = 0,emax = 127。例如-11的二进制表示是-1011,它被转换成上面的IEEE表示,如下所示
(-1)1x(10)3x(1.011),IEEE表示法编码为32位二进制数。
其中e由帧移位表示,
关于浮点数的IEEE规定的相关内容,请参考IEEE浮点运算标准。