[问题] 变形的浮点数逆运算(PMbus)

楼主: chrisdar   2018-03-26 11:17:06
最近研读 PMbus Linear Data Format (http://benjr.tw/94214),
并试着用python 3.x实作之. (python 只是用作简易示范, 问题是问逆算法)
正运算实作出来如下, 逆运算却做不出来, 求教 谢谢。
正运算
dat = bitstruct.unpack('u5u11',b'\xF0\x1C')
pprint.pprint([bin(x) for x in dat])
n = bitstring.Bits(bin='{0:005b}'.format(dat[0]))
y = bitstring.Bits(bin='{0:011b}'.format(dat[1]))
print(math.ldexp(y.int,n.int)) #7.0
dat = bitstruct.unpack('u5u11',b'\xeb\xa9')
pprint.pprint([bin(x) for x in dat])
n = bitstring.Bits(bin='{0:005b}'.format(dat[0]))
y = bitstring.Bits(bin='{0:011b}'.format(dat[1]))
print(math.ldexp(y.int,n.int)) #117.125
姑且用试误法把答案凑出来 但是还是不知道哪里怪 5跟10 调整次方项
也不知道为何而调 在此请教逆运算的算法
(y,n) = math.frexp(7.0)
print((y,n)) #(0.875, 3)
(y,n) = (y*(2**5),n-(5))
print((y,n)) #(28.0, -2)
print(math.ldexp(y,n)) #7.0
dat = bitstruct.pack('u5u11',32+n, y)
print([hex(x) for x in dat]) #['0xf0', '0x1c']
(y,n) = math.frexp(117.125)
print((y,n)) #(0.9150390625, 7)
(y,n) = (y*(2**10),n-(10))
print((y,n)) #(937.0, -3)
print(math.ldexp(y,n)) #117.125
dat = bitstruct.pack('u5u11',32+n, y)
print([hex(x) for x in dat]) #['0xeb', '0xa9']
感觉只有两种调法 5/10
8192.0 => ['0x48', '0x10'] (次方调整5) , ['0x22', '0x00'] (次方调整10)

Links booklink

Contact Us: admin [ a t ] ucptt.com