十進制數轉IEE754單精度浮點數
理解題目
單精度浮點數:單精度浮點數是用來表示帶有小數部分的實數,一般用於科學計算。占用4個字節(32位)存儲空間,包括符號位1位,階碼8位,尾數23位。其數值范圍為-3.4E38~3.4E38,單精度浮點數最多有7位十進制有效數字,單精度浮點數的指數用“E”或“e”表示。
具體規則及例子
規則參照鏈接https://zhidao.baidu.com/question/457693134.html
較詳細講解了單精度浮點數向十進制的轉化,倒着看即可理解十進制轉浮點數
5.75→01000000101110000000000000000000
161.875→01000011001000011110000000000000
-0.0234375→10111100110000000000000000000000
python語句實現
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(-5.56))
或有代碼如https://www.cnblogs.com/saberwc/p/13833545.html