關於小數計算引發的定點數思考

2022-05-02 17:36:11 字數 1419 閱讀 2437

在寫coric演算法實現**的時候,遇到了小數問題如下:

、第31行的**如下:

這說明了寫成小數形式,不會通過編譯器的檢查(暫且叫做編譯器),編譯器無法識別這種小數的表示方法。但我們又確實需要進行小數的計算,比如加法的;

比如1.4567+2.34789。編譯都無法編譯,那麼該如何計算呢?

我們知道,比如編譯器能夠識別並計算145670+234789=380459。那麼很自然的想到了將380459左移5位,不就得到我們想要的結果3.80459了嗎?

這提供給了我們這樣的乙個原始的思路:將我們 要計算的數先擴大很多倍,變成整數,進行加減(假設也包括了乘除)運算,再將結果縮小同樣的倍數,那麼就得到我們要的結果。

即我們進行1.4567*10^5+2.34789*10^5=380459,再進行380459÷10^5.就得到了我們想要的結果。這已經是定點數表示的雛形了,但還不夠完善,還需要解決兩個問題:

1.我們究竟該乘10的多少次方?計算機的計算限制也不允許我們乘的太大了。假設我的計算機很low,只能×10^4.則會得到:

14567+23479=38046(注意,計算機可不會什麼四捨五入,只會硬邦邦的算!),38046÷10^4=3.8046;

我們發現,由於計算機很low,導致了我們的計算結果不夠精確,但是和原來很接近!!

假設計算機更low,只能擴大10^3,發生了下面的事情:

1456+2347=3803,     3803÷10^3=3.803;

我們發現,結果的精度進一步降低了,如果我們擴大的倍數比較小的話。

上述試驗反應了如下問題:我們確實可以通過將所有的小數擴大x倍轉化成整數,進行加減,再÷x倍,就能得到我們要求解的數,而且擴大的倍數比較大的時候,得到的結果較為精確。

2 乘以10^n真的好嗎?

定點數都是×2^n,為啥不是10^n

呢,不是更直觀嗎?請注意,最後總要進行除法運算,得到我們想要得到的東西,但是除以10^n需要動用乘法器!!!或者我們自己設計乙個複雜的演算法,但是÷2^n就很簡單,直接進行右移n位即可。因此,我們選擇將乙個數×2^n

這樣的操作。

這就是定點加法的本質(乘法之後再討論),關於為什麼叫做定點,因為小數點的位置是固定的,不需要硬體進行考慮的。通過我們擴大小數變成整數可以看出來,我們可以理解為小數點的位置在整數的最右端。即小數點的位置固定在整數的個位右邊,至此完成了對定點數的完整分析,之後進行fpga定點數(多是小數)計算以及dsp的定點計算的時候,在數值初始化的時候,務必不要忘了要進行×2^n這種操作!!主要原因在於沒有作業系統!!!!!!!!沒法優化小數

下面附一張示例圖供以後參考:

這個圖同時也告訴我們了verilog中進行巨集定義(假設是這麼叫)的做法!!!!假設我們要使用某個變數,比如rot1,則為 :  `rot1。

定點數與浮點數 小數

一 計算機中一共有兩種機器數型別 機器數就是計算機中參與運算的有符號二進位制數,其實,它與我們平時使用的十進位制一樣,有整數也有小數,但是關鍵在於,如果二進位制與我們平時書寫十進位制小數一樣,帶上乙個 那麼二進位制受困於儲存器中字長的限制,無法靈活地表示小數的小數點 所以,二進位制的小數在儲存器中的...

定點數和浮點數 定點數和浮點數計算

這個東西其實不是很難,但是確實足夠繞的,因為從十進位制的加減乘除轉換到二進位制的加減乘除就已經很麻煩了,然後為了選拔人才,不給你二進位制,直接給你十六進製制,當然最麻煩的還是補碼和移碼,確實足夠 但是給予足夠的練習還是可以比較熟練的,公式稍後會整理到置頂的公式大全中。可以看完了以後去嘗試一下相關計算...

定點數的表示

計算機中常用的資料表示格式有兩種,一是定點格式,二是浮點格式。所謂定點數和浮點數,是指在計算機中乙個數的小數點的位置是固定的還是浮動的 如果乙個數中小數點的位置是固定的,則為定點數 如果乙個數中小數點的位置是浮動的,則為浮點數。一般來說,定點格式可表示的數值的範圍有限,但要求的處理硬體比較簡單。而浮...