1. 程式人生 > 其它 >IEEE754 浮點數

IEEE754 浮點數

把十進位制數5.75,161.875,-0.0234375 的單精度浮點數

5.75
第一步 轉換成二進位制
5=101
.75=.11
5.75=101.11
S=0
第二步移動小數點 1.0111 移動兩位e=2
E=127+2=129
=10000001
M=01110000000000000000000

161.875
=10100001
.875=.111
S=0
移動7位e=7
E=134=10000110
M=01000011110000000000000

-0.0234375
轉換成二進位制,只保留八位,為-0.0000011
移動6位 e=6
S=1
E=121=1111001
M=00000110000000000000000

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) # E=e+127
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 :] # 獲得尾數,注意當尾數的值不為0時,尾數的最高有效位應為1,這稱為浮點數的規格化表示
else :
exponet = ConvertToExponentMarker(relativePos)#獲得階碼
mantissa = floatingPointString[floatingPointString.find('1') + 1: ] # 獲得尾數
mantissa = mantissa[:23] + '0' * (23 - len(mantissa))
floatingPointString = '0b' + sign + exponet + mantissa #S,E,M整合起來
print(floatingPointString)
return hex( int( floatingPointString , 2 ) )
X=ConvertToFloat(input(“輸入一個十進位制數”))
print(x)

問題

len(s)< 3 中
23位的不是尾數嗎,和符號位是什麼關係