Python實現十進制小數轉IEEE754單精度浮點數轉換


def ConvertFixedIntegerToComplement(fixedInterger) :#浮點數整數部分轉換成補碼(整數全部為正)
    return bin(fixedInterger)[2:]

def ConvertFixedDecimalToComplement(fixedDecimal) :#浮點數小數部分轉換成補碼
    fixedpoint = int(fixedDecimal) / (10.0**len(fixedDecimal))
    s = ''
    while fixedDecimal != 1.0 and len(s) < 23 :
        fixedpoint = fixedpoint * 2.0
        s += str(fixedpoint)[0]
        fixedpoint = fixedpoint if str(fixedpoint)[0] == '0' else fixedpoint - 1.0
    return s

def ConvertToExponentMarker(number) : #階碼生成
    return bin(number + 127)[2:].zfill(8)


def ConvertToFloat(floatingPoint) :#轉換成IEEE754標准的數
    floatingPointString = str(floatingPoint)
    if floatingPointString.find('-') != -1 :#判斷符號位
        sign = '1'
        floatingPointString = floatingPointString[1:]
    else :
        sign = '0'
    l = floatingPointString.split('.')#將整數和小數分離
    front = ConvertFixedIntegerToComplement(int(l[0]))#返回整數補碼
    rear  = ConvertFixedDecimalToComplement(l[1])#返回小數補碼
    floatingPointString = front + '.' + rear #整合
    relativePos =   floatingPointString.find('.') - floatingPointString.find('1')#獲得字符1的開始位置
    if relativePos > 0 :#若小數點在第一個1之后
        exponet = ConvertToExponentMarker(relativePos-1)#獲得階碼
        mantissa =  floatingPointString[floatingPointString.find('1')+1 : floatingPointString.find('.')]  + floatingPointString[floatingPointString.find('.') + 1 :] # 獲得尾數
    else :
        exponet = ConvertToExponentMarker(relativePos)#獲得階碼
        mantissa = floatingPointString[floatingPointString.find('1') + 1: ]  # 獲得尾數
    mantissa =  mantissa[:23] + '0' * (23 - len(mantissa))
    floatingPointString = '0b' + sign + exponet + mantissa
    print(floatingPointString)
    return hex( int( floatingPointString , 2 ) )

print(ConvertToFloat(20.59375))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM