浮点数据格式符号+指数

时间:2017-07-18 22:13:47

标签: math

我正在从热量表接收UART数据,但我需要一些帮助才能理解我应该如何处理数据。 我有文档,但这对我来说还不够,我对这种计算几乎没有经验。

也许拥有合适技能的人可以向我解释如何使用文档中的更好示例来完成它。

One value consists of the following bytes: 

[number of bytes][sign+exponent] (integer) 

(integer) is the register data value. The length of the integer value is 
specified by [number of bytes].   [sign+exponent] is an 8-bit value that 
specifies the sign of the data value and sign and value of the exponent. The 
meaning of the individual bits in the [sign+exponent] byte is shown below: 

Sign Exponent

Examples: 

-123.45 = 04h, C2h, 0h, 0h, 30h, 39h 

87654321*103  = 04h, 03h , 05h, 39h, 7Fh, B1h 

255*103  = 01h, 03h , FFh 

现在再以实际数据为例。

enter image description here

这是我从文档中获得的有关此信息的信息。

这是我从热量表收到的一些数据

10 00 56 25 04 42 00 00 1B E4

所以在我的例子中,04是[字节数],42是[符号+指数],00 00 1B E4是(整数)。 但我不知道如何进行计算以获得实际值。

任何帮助?

2 个答案:

答案 0 :(得分:1)

根据您的示例,您的数据似乎是大端的。所以这就是你如何使用位移和屏蔽将这些字节分成你需要的字段。

n = b[0]
SI = (b[1] & 0x80) >> 7
SE = (b[1] & 0x40) >> 6
exponent = b[1] & 0x3f
integer = 0
for i = 0 to n-1:
    integer = (integer << 8) + b[2+i]

答案 1 :(得分:0)

尾数的符号是​​通过屏蔽(byte & 80h != 0 => SI = -1)从符号+指数字节的MSb获得的。

指数的符号同样由byte & 40h != 0 => SE = -1获得。

指数值为EXP = byte & 3Fh

尾数INT是由其他四个字节组成的二进制数,可以读作一个整数(但请注意印度)。

最后,计算SI * INT * pow(10, SE * EXP)

在您的示例中,SI = 1SE = -1EXP = 2INT = 7140,因此

1 * 7140 * pow(10, -1 * 2) = +71.4

解释如何有效地实现这一点并不在本答案的范围内。