gpt4 book ai didi

python - 当指数达到-127时如何在python中计算尾数

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:40 25 4
gpt4 key购买 nike

我有一个十六进制字符串的位置信息。我需要通过 IEEE-754 协议(protocol)将其转换为浮点整数。

所以我编写了这段代码来查找数字的符号,根据给定十六进制数的二进制表示计算指数尾数

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 ,符号和指数结果是正确的,但尾数结果与我的不同。

我遗漏了有关该页面所说内容的一些信息:

As a result, the mantissa has a value between 1.0 and 2. If the exponent reaches -127 (binary 00000000), the leading 1 is no longer used to enable gradual underflow.

无论如何,我知道问题出在这里,但是我的英语水平不够,我想不通

最佳答案

经过@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

关于python - 当指数达到-127时如何在python中计算尾数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36713308/

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