python实现double型浮点数在内存中的存储样式转换接口

话不多说 ,直接上代码


import decimal



def convertDouble2Bin(double):  
    """ 
    function:将十进制双精度数转化为内存中存储的二进制数
    eg: convertDouble2Bin(double) 
    return:内存中的二进制串
    
    double in sram:
        1     |     2-12     |     13-64
             符号位                       指数位                           尾数位
    """  
    bit = 63    #0的double型移码 :01111111111,指数位下限为0000000000000,故最多计算63位二进制小数位(53位尾数+10位指数)
    negative = 0  
    if double < 0:  
        negative = 1  
        double = -1 * double
    #Separate integer and decimal  
    integer = int(double)                        # 整数部分  
    decimalPart = decimal.Decimal(str(double)) - integer     # 小数部分  
    integer_convert = ""         # 转化后的整数部分  
    decimal_convert = ""         # 转化后的小数部分  
    binary = ""                  # 最后内存中存储的二进制数  
    index = 0                    # 指数
    bInt = True




    if integer==0 and decimalPart==0:
        binary += "0"*64
        return binary




    if decimalPart!=0:
        bInt = False
    if integer == 0: # <1  
        i = 0  
        while decimalPart != 0 and i < bit:  
            result = int(decimalPart * 2)  
            decimalPart = decimalPart * 2 - result  
            decimal_convert = decimal_convert + str(result)  
            i = i + 1
        for i in range(len(decimal_convert)):
            index -= 1
            if decimal_convert[i]=="1":
                break
        if i             decimal_convert = decimal_convert[i+1:]
        else:
            decimal_convert = "0"
    else: #>=1`
        while integer != 0:  
            result = int(integer % 2)  
            integer = integer / 2  
            integer_convert = str(result) + integer_convert
        #decimalPart 
        if decimalPart == 0:
            decimal_convert = "0"   
        else:  
            i = 0  
            while decimalPart != 0 and i < bit:  
                result = int(decimalPart * 2)  
                decimalPart = decimalPart * 2 - result  
                decimal_convert = decimal_convert + str(result)  
                i = i + 1     
        index = len(integer_convert)-1
        if index>0:
            decimal_convert = integer_convert[1:] + decimal_convert 
    
    #calculate the index of double
    index += 1023   #加上0的补码
    indexStr = ""      
    while index != 0:  
        result = int(index % 2)  
        index = index / 2  
        indexStr = str(result) + indexStr
    indexLen = len(indexStr)
    if indexLen<11:
        indexStr = "0"*(11-indexLen)+indexStr
    
    mantissa = decimal_convert
    mantissaLen = len(mantissa)
    
    if mantissaLen<52:
        if bInt: # integer
            mantissa = mantissa + (52-mantissaLen)*'0'
        else:
            mantissa = (52-mantissaLen)*'0'+mantissa
    elif mantissaLen>52:
        bBorrow = False
        i = 52
        if mantissa[i]=='1':
            bBorrow = True
        while i>0 and bBorrow:
            if mantissa[i-1]=='1':
                mantissa = mantissa[:i-1]+'0'+mantissa[i:]
            else:
                mantissa = mantissa[:i-1]+'1'+mantissa[i:]
                bBorrow = False
            i -= 1
        mantissa = mantissa[0:52]
        
    binary = indexStr + mantissa
    if negative == 1:  
        binary = '1' + binary
    else:
        binary = '0' + binary
    
    return binary  




def DoubleToHex(double, bTurnByteOrder=1):
    """ 
    function:将十进制双精度数转化为内存中的存储样式
    """ 
    binStr = convertDouble2Bin(double)
    strNum = ""
    hexArray = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
    strLen = len(binStr)
    for i in range(strLen>>2):
        dNum = eval(binStr[i<<2])*8+eval(binStr[(i<<2)+1])*4+eval(binStr[(i<<2)+2])*2+eval(binStr[(i<<2)+3])
        strNum += hexArray[dNum]
    
    if bTurnByteOrder:
        strNum =TurnByteOrder(strNum)
        
    return strNum

你可能感兴趣的:(python实现double型浮点数在内存中的存储样式转换接口)