2016-04-19 6 views
2

16進数の文字列で位置情報を取得しました。 IEEE-754プロトコルで浮動整数に変換する必要があります。指数が-127に達すると、Pythonで仮数を計算するには

だから所与進数のバイナリ表現から指数仮数を計算し、数値の符号を見つけるために、このコードを書きました。

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 

問題があります。 指数が-126より小さく、たとえば-127の場合、結果は正しくありません。私は結果を確認するfrom this address、符号と指数の結果は正しいが、仮数の結果は私のものとは異なります。

私はそのページが言っていることについて何か足りないのです:

結果を 指数は-127(バイナリ00000000)に達した場合は、仮数が1.0と2の間の値を持ち、大手1は、徐々にアンダーフローを可能にするために使用される ではなくなりました。

私は問題がここにある知っている任意の方法が、ため、私は私の不十分な英語で把握することはできません。

+2

を。次に、あなたができることが分かります。 –

答えて

2

@Rudy Velthuisの提案後、指数が-127に達すると、指数-126で1.0を取り除く必要があることが分かりました。だから、結果は次のとおりです。

#! /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

0

この方法は、私の作品と私は一貫してあなたのスクリプトから同じ出力を得る:IEEE754と非正規化値について少しを読む

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

>>> ieee754(0x436be878) 
235.9080810546875