[問題] 變形的浮點數逆運算(PMbus)消失

看板Prob_Solve作者時間6年前 (2018/03/26 11:17), 6年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
最近研讀 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) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 106.1.10.98 ※ 文章網址: https://www.ptt.cc/bbs/Prob_Solve/M.1522034229.A.34B.html ※ 編輯: chrisdar (106.1.10.98), 03/26/2018 11:53:04
文章代碼(AID): #1Qk6OrDB (Prob_Solve)