[問題] 變形的浮點數逆運算(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