在某些專案中需要將十進位制小數轉化為二進位制補碼後進一步處理。例如在fft中,旋轉因子的在[-1,1]之間,butterfly計算結果需要乘旋轉因子的值,所以首先將其轉化為二進位制補碼。
本文僅僅只針對在(-1,1)之間小數處理,對於端點值 -1 和 1 需要單獨處理
**如下:
def decimal_to_binary(num,prec= 5):
'''#將小數轉化為二進位制數'''
str_bin = ''
if num < 0:
str_bin += '1'
else:
str_bin += '0'
count = 1
num = abs(num)
while(count < prec):
if int(num*2) == 1:
str_bin += '1'
num = num*2 - int(num*2)
else:
num *= 2
str_bin += '0'
count += 1
return str_bin
test = decimal_to_binary(-0.7158203125,11) #0.7158203125*****==11011011101
print(test)
def true_to_complement(str):
'''將二進位制數轉化為補碼'''
flag = true
str_new = ''
if str[0] == '0':
return str #正數補碼不變,負數將原始碼取反+1
else:
for word in str[1:]:
if word == '1':
str_new += '0'
if word == '0':
str_new += '1'
str_flash = '1' + str_new
i = len(str_flash) -1
while(flag):
if(str_flash[i] == '1'):
i -= 1
elif (str_flash[i] == '0'):
flag = false
return str_flash[0:i] + '1' + (len(str_flash)-i-1)*'0'
print(true_to_complement(test))
注:
該**已經進過測試,可以直接使用
prec變數代表精度,其中第一位代表符號位,剩餘位代表數值位,小數點在符號位後面
完結。。。。。。
歡迎交流 email : [email protected]
10進製小數轉化為任意進製小數
將任意十進位制正小數分別轉換成2,3,4,5,6,7,8,9進製正小數,小數點後保留8位,並輸出。例如 若十進位制小數為0.795,則輸出 十進位制正小數 0.795000 轉換成 2 進製數為 0.11001011 十進位制正小數 0.795000 轉換成 3 進製數為 0.21011011 十進...
迴圈小數轉化為分數
眾所周知迴圈小數是可以轉化為分數的。把迴圈小數轉化為分數一般用極限的方法,比如0.33333.可以看成是0.3 0.03 0.003 這個等比數列的值,然後求等比數列的和,設有n個數,則根據等比數列公式得和為0.3 1 0.1 n 1 0.1 化簡得 1 0.1 n 3,n為無限多個,n趨於無窮大時...
十進位制小數轉化為二進位制小數
轉了這篇文章,完全是群裡討論計算機無法精確表示小數才想找一下原因的。究其原因就是十進位制小數無法用2進製表示 0.5什麼的可以表示 大學也學過,不過已經忘了。一 二進位制數轉換成十進位制數 由二進位制數轉換成十進位制數的基本做法是,把二進位制數首先寫成加權係數展開式,然後按十進位制加法規則求和。這種...