2016-04-19 1 views
2

J'ai une information de localisation dans la chaîne HEX. J'ai besoin de le convertir en entier flottant par le protocole IEEE-754.Comment calculer la mantisse en python lorsque l'exposant atteint -127

J'ai donc écrit ce code pour trouver signe du nombre, calculer exposant et mantisse de la représentation binaire du nombre hexadécimal donné.

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 

Le problème est; Si exposant est inférieur à -126, disons -127, le résultat n'est pas correct. Je vérifie le résultat from this address, les résultats du signe et de l'exposant sont corrects mais le résultat de la mantisse est différent du mien.

je manque quelque chose au sujet de la page est ce que dit:

En conséquence, la mantisse a une valeur comprise entre 1,0 et 2. Si l'exposant atteint -127 (00000000 binaire), le leader 1 n'est plus utilisé pour activer le sous-dépassement progressif.

De toute façon je sais que le problème est ici, mais je ne peux pas comprendre à cause de mon manque anglais.

+2

Lire un peu IEEE754 et les valeurs dénormalisées. Ensuite, vous verrez ce que vous pouvez faire. –

Répondre

2

Après la suggestion de @Rudy Velthuis J'ai compris que je dois supprimer 1.0 et calculer avec l'exposant -126 si l'exposant atteint à -127. Le résultat est donc:

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

Cette méthode fonctionne pour moi et je reçois toujours la même sortie de votre script:

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

>>> ieee754(0x436be878) 
235.9080810546875