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

Posted

技术标签:

【中文标题】当指数达到-127时如何在python中计算尾数【英文标题】:How to calculate mantissa in python when exponent hit to -127 【发布时间】:2016-04-19 08:51:12 【问题描述】:

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

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

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不再是 用于启用逐渐下溢。

不管怎样,我知道问题出在这里,但是因为我的英语不够,我想不通

【问题讨论】:

阅读一点关于 IEEE754 和非规范化值的信息。然后你会看到你能做什么。 【参考方案1】:

在@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

【讨论】:

【参考方案2】:

此方法对我有用,并且我始终从您的脚本中获得相同的输出:

import struct
def ieee754(value):
    packed_v = struct.pack('>l', value)
    return struct.unpack('>f', packed_v)[0]

>>> ieee754(0x436be878)
235.9080810546875

【讨论】:

以上是关于当指数达到-127时如何在python中计算尾数的主要内容,如果未能解决你的问题,请参考以下文章

如何用Python计算BMI值?

Swift 中如何避免精度丢失

Cocoa:尾数和指数为 0 的 NSDecimalNumber

关于IEEE754中的浮点数的阶码的表示问题

尾数和指数 - 带小数的负数(超过 0.5)

第3课 浮点数的秘密