gpt4 book ai didi

python - 在python中解析十六进制格式的DEC 32位单精度浮点值

转载 作者:行者123 更新时间:2023-11-28 21:30:42 24 4
gpt4 key购买 nike

我在 python 中解析十六进制格式的 DEC 32 位单精度浮点值时遇到问题,我正在解析的值以十六进制表示为 D44393DB。原始浮点值约为 108,从发送单元的显示屏读取。

格式指定为:1位符号+8位指数+23位尾数。字节 2 包含符号位 + 指数的 7 个最高有效位字节 1 包含指数的最低有效位 + 尾数的起始最高有效位。

我发现这两种格式唯一不同的是指数的偏差,在 DEC32 中为 128,在 IEEE-754 中为 127 ( http://www.irig106.org/docs/106-07/appendixO.pdf )

使用http://babbage.cs.qc.edu/IEEE-754/32bit.html没有给出预期的结果。

/克里斯托弗

最佳答案

字节是否有可能以某种方式被打乱?您描述的位排列(字节 2 中的符号位,字节 1 中指数的 LSB)与您链接到的附录 O 不同。看起来字节 1 和 2 已交换。

我假设字节 3 和 4 也被交换,因此真正的十六进制值为 43D4DB93。转换为二进制为 0100 0011 1101 0100 1101 1011 1001 0011,因此符号位为 0,表示正数。指数是 10000111(二进制)= 135(十进制),表示因数 2^(135-128) = 128。最后,尾数是 0.1101 0100 1101 1011 1001 0011(二进制),使用附录 O 表示您有前面加0.1,大约是十进制的0.8314。所以根据我的假设,你的数字是 0.8314 * 128 = 106.4。

添加:一些 Python 2 代码可能会澄清:

input = 0xD44393DB;
reshuffled = ((input & 0xFF00FF00) >> 8) | ((input & 0x00FF00FF) << 8);
signbit = (reshuffled & 0x80000000) >> 31;
exponent = ((reshuffled & 0x7F800000) >> 23) - 128;
mantissa = float((reshuffled & 0x007FFFFF) | 0x00800000) / 2**24;
result = (-1)**signbit * mantissa * 2**exponent;

这会产生 result = 106.42885589599609 .

这里是计算尾数的行的解释。首先reshuffled & 0x007FFFFF产生编码尾数的 23 位:101 0100 1101 1011 1001 0011。然后 ... | 0x00800000设置隐藏位,产生 1101 0100 1101 1011 1001 0011。我们现在必须计算分数 0.1101 0100 1101 1011 1001 0011。根据定义,这等于 1*2^(-1) + 1*2^(-2) + 0*2^(-3) + ... + 1*2^(-23) + 1*2^(-24) 。这也可以写成(1*2^23 + 1*2^22 + 0*2^21 + ... + 1*2^1 + 1*2^0) / 2^24 。括号中的表达式是1101 0100 1101 1011 1001 0011(二进制)的值,所以我们可以通过除(reshuffled & 0x007FFFFF) | 0x00800000来找到尾数。 2^24。

关于python - 在python中解析十六进制格式的DEC 32位单精度浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1797806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com