我在HEX字符串中获得了位置信息。我需要通过IEEE-754协议将其转换为浮动整数。
所以我编写了这段代码来查找数字的 sign ,从给定的十六进制数的二进制表示中计算 exponent 和 mantissa 。 / p>
def _calculte_mantissa(bin_number):
val = 1
bit_count = -1
bit_length = 0
while bit_length <= 22:
print bit_count, bit_length
val += int(bin_number[bit_length]) * 2**bit_count
bit_count -= 1
bit_length += 1
print val
return val
def convert_position(pos):
bin_pos = format(int(pos, 16), "0>32b")
sign = (-1)**int(bin_pos[0], 2)
exponent = int(bin_pos[1:9], 2) - 127
mantissa = _calculte_mantissa(bin_pos[9:])
position = sign * 2**exponent * mantissa
return position
问题是;如果 exponent 小于-126,比如-127,则结果不正确。我检查结果from this address,符号和指数结果是否正确,但尾数结果与我的不同。
我错过了关于该页面所说的内容:
因此,尾数的值介于1.0和2之间 指数达到-127(二进制00000000),前导1不再 用于实现逐渐下溢。
我知道问题的任何方式都在这里但由于我的英语不足而无法弄明白。
答案 0 :(得分:2)
在建议@ Rudy Velthuis后,我发现如果指数达到-127,我需要删除1.0并用指数-126计算。结果是:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
def _calculte_mantissa(bin_number, exponent):
val = 1 if exponent > -127 else 0
bit_count = -1
bit_length = 0
while bit_length <= 22:
val += int(bin_number\[bit_length\]) * 2**bit_count
bit_count -= 1
bit_length += 1
return val
def convert_ieee754(hex_val):
bin_pos = format(int(hex_val, 16), "0>32b")
sign = (-1)**int(bin_pos\[0\], 2)
_exponent = int(bin_pos\[1:9\], 2) - 127
mantissa = _calculte_mantissa(bin_pos\[9:\], _exponent)
exponent = _exponent if _exponent > -127 else -126
position = sign * 2**exponent * mantissa
return "Bin: %s - Sign: %s - Exponent: %s (%s) - Mantissa: %s - Posititon: %s" % (bin_pos, sign, exponent,
_exponent, mantissa, position)
if __name__ == "__main__":
argvs = sys.argv
print convert_ieee754(argvs\[1\])
sys.exit()
https://github.com/RecNes/Python-IEEE754-Calculator-with-Denormalized-Values/blob/master/ieee754.py
答案 1 :(得分:0)
此方法适用于我,我从脚本获得的输出始终如一:
import struct
def ieee754(value):
packed_v = struct.pack('>l', value)
return struct.unpack('>f', packed_v)[0]
>>> ieee754(0x436be878)
235.9080810546875