1. 程式人生 > >定點數與浮點數的相互轉換

定點數與浮點數的相互轉換

      最近要寫段數字運算的程式,因為從FPGA獲取到的是定點數,15位數,最高位bit14是符號位,bit13是整數位,後面13位是小數位; 而我的運算過程都是用的浮點數,通過一系列計算後,還需要將計算的結果以定點數的形式寫入暫存器,所以首先需要寫一個定點數和浮點數相互轉換的函式。

     首先明確一下定點數和浮點數的概念:

定點數
       定點數是小數點固定的數。在計算機中沒有專門表示小數點的位,小數點的位置是約定預設的。一般固定在機器數的最低位之後,或是固定在符號位之後。前者稱為定點純整數,後者稱為定點純小數。

      例題:用8位原碼錶示定點整數(100)10
      (100)10 = (1100100)2
      定點整數表示為


      例題:用8位原碼錶示定點純小數(-0.6875)10
       (-0.6875)10 = (-0.1011)2
       定點純小數表示為



      定點數表示法簡單直觀,但是數值表示的範圍太小,運算時容易產生溢位

浮點數
       浮點數是小數點的位置可以變動的數。為增大數值表示範圍,防止溢位,採用浮點數表示法。浮點表示法類似於十進位制中的科學計數法。
      在計算機中通常把浮點數分成階碼和尾數兩部分來表示,其中階碼一般用補碼定點整數表示,尾數一般用補碼或原碼定點小數表示。為保證不損失有效數字,對尾數進行規格化處理,也就是平時所說的科學記數法,即保證尾數的最高位為1,實際數值通過階碼進行調整。
      一般浮點數在機器中的格式為:


      階符表示指數的符號位、階碼錶示冪次、數符表示尾數的符號位、尾數表示規格化後的小數值。
            N = 尾數×基數階碼(指數)
      例題:二進位制數-110101101.01101可以寫成:-0.11010110101101×21001
      這個數在機器中的格式為(階碼用8為表示,尾數用24位表示)

C語言程式碼實現如下:

/*<FUNC>***********************************************************************
* 函式名稱: BspFixToDou
* 功能描述: 將指定的定點數 轉化為 浮點數
* 演算法描述: 無
* 輸入引數: ucType 0表示無符號 1表示有符號
*           ucInteger 表示整數佔幾個bit
*           ucdecimal 表示小數佔幾個bit
*           llfix 為待轉化的定點數
* 輸出引數: 無
* 返 回 值: 無

************************************************************************/

VOID BspFixToDou(UCHAR ucType, UCHAR ucInteger, UCHAR ucdecimal, UINT64 llfix, DOUBLE *pdbRet)
{
    UINT64 lltemp = llfix & ((((UINT64)(1)<<(ucType + ucInteger + ucdecimal))-1));
    if(0 == llfix)
    {
        *pdbRet = 0.0;
    }
    if(lltemp & (((UINT64)(1)<<(ucInteger + ucdecimal)))) /* 有符號數並且是負數 */
    {
        *pdbRet = -(DOUBLE)(((UINT64)(1)<<(ucType + ucInteger + ucdecimal)) - lltemp)/(DOUBLE)((UINT64)(1)<<ucdecimal);    
    }
    else                                         /* 無符號數或者有符號數的正數*/
    {
        *pdbRet = (DOUBLE)((DOUBLE)lltemp/(DOUBLE)((UINT64)1<<ucdecimal));
    }
}

/*<FUNC>***********************************************************************
* 函式名稱: BspDouToFix
* 功能描述: 將指定的浮點數 轉化為 定點數
* 演算法描述: 無
* 輸入引數:  ucType 0表示無符號 1表示有符號
*           ucInteger 表示整數佔幾個bit
*           ucdecimal 表示小數佔幾個bit
*           dbDou 為待轉化的浮點數
* 輸出引數: 無
* 返 回 值: 轉化後的定點數

************************************************************************/

VOID BspDouToFix(UCHAR ucType, UCHAR ucInteger, UCHAR ucdecimal, DOUBLE dbDou, UINT64 *pllfix)
{
    UINT64 lltemp = 0;
    DOUBLE dbtemp = 0;
    
    dbtemp = dbDou;
    if(dbtemp < 0) /* 有符號正數 或者 無符號數 */
    {
        lltemp = (UINT64)(-dbDou*(1<<ucdecimal));
        *pllfix = (UINT64)((UINT64)(1)<<(ucType + ucInteger + ucdecimal)) -    lltemp;    
    }
    else if(dbtemp > 0)   /* 有符號負數 */
        {
            *pllfix = (UINT64)(dbDou * (1<<ucdecimal));
        }
        else
        {
            *pllfix = 0;
        }
}

相關推薦

點數點數相互轉換

      最近要寫段數字運算的程式,因為從FPGA獲取到的是定點數,15位數,最高位bit14是符號位,bit13是整數位,後面13位是小數位; 而我的運算過程都是用的浮點數,通過一系列計算後,還需要將計算的結果以定點數的形式寫入暫存器,所以首先需要寫一個定點數和浮點數相

Erlang 整數點數轉換、進位制轉換

Erlang 整數與浮點數的轉換、數字之間的進位制轉換,浮點數改變精度等等這些功能,Erlang BIF(Erlang內建函式)已經幫我們很好實現,呼叫他們也很方便,下面將簡單說明如何去使用他們。 erlang整數與浮點數轉換 整數轉浮點數: % BIF函式 1> f

11、點數點數

1.0 完全 偏移量 壓縮 浪費 平方根 整數加法 內部 二進制表示 我們平時都會用到小數,通常我們可以把小數表示成10的冪的形式,如12.21=1x101+2x100+2x10-1+1x10-2。但是有一些很難表示,如1/3. 小數用二進制表示的最簡單的方法是BCD碼,這

二進制轉換、字符編碼的演化、Python裏使用的編碼、點數點數的精確度問題

空格 符號 image com idt 個人 如果 數碼 mage 二進制轉換 二進制是計算技術中廣泛采用的一種數制。二進制數據是用0

編碼的奧祕:點數點數

轉自:《編碼的奧祕》    第二十三章                日常生活中,有各種各樣的數,整數、分數、百分數等等,我們無時無刻不與這些數打交道。如:用加班 2 . 7 5小時獲得的

sprintf點數的表示

在將各種型別的資料構造成字串時,sprintf 的強大功能很少會讓你失望。由於sprintf 跟printf 在用法上幾乎一樣,只是列印的目的地不同而已,前者列印到字串中,後者則直接在命令列上輸出。這也導致sprintf 比printf 有用得多。sprintf 是個變參函式

[Python標準庫]decimal—點數點數的數學運算

[Python標準庫]decimal——定點數和浮點數的數學運算        作用:使用定點數和浮點數的小數運算。        Python 版本:2.4 及以後版本        decimal 模組實現了定點和浮點算術運算子,使用的是大多數人所熟悉的模型,而不是程式設計師熟悉的模型,即大多數計算機硬體

Js 點數

同步發表在我的部落格:jmingzi 當你學習一個知識點沒有方向時,可以嘗試以解決問題的角度來理解它。 例如這個知識點我們可以從以下問題開始: 你看的到 1 真的是整數 1 嗎? 為什麼0.1 + 0.2 得到的是 0.30000000000000004 而不是 0.300000000000000049

ArcMap中使用ArcPy實現GeometryWKT的相互轉換

bottom ast 我們 python 函數 == 其它 相關 圖形 在Web GIS迅猛發展的今天,使用瀏覽器來進行交互以其方便性、快捷性被廣大用戶所推崇,那麽在傳輸格式方面,都已比較簡單的JSON或者WKT來解決網絡帶寬帶來的數據壓力。在ArcGIS10.2版本號

jQuery添加添加時間時間戳相互轉換組件

get parse col cse [0 typeof 相互 兼容 min 時間與時間戳的格式相互轉換(轉換主要兼容ie8,ie8不支持new Date()) (function($) { $.extend({ myTime: {

JQJS的相互轉換

-s 轉換 由於 spa () col $() 互轉 dom對象 $()函數是JQ對象的制造工廠,或者講JQ對象都是由此函數生成的。 1、在JQ對象變量名前加$,格式: var $變量名=JQ對象; 在dom對象變量名前不加$,格式: var 變量名=JS對象; 例如: v

Android GIS開發系列-- 入門季(8) JsonGeometry的相互轉換

相互轉換 them 實用 興趣 parse 執行 pretty pre andro 在Android中json數據十分普遍,也很實用,在Arcgis中也同樣支持Json數據,Json與Geometry可以相互轉換,達到我們想要的數據。 一、Geometry轉換成Json數

PowerDesigner概念模型物理模型相互轉換及導出數據字典

microsoft 字典 ros 去掉 相互轉換 右擊 soft designer design 最近公司項目竣工,驗收完成後,把整體平臺的所有文檔都寫清楚,找包發給甲方,由於本人是維護數據庫工作,依上面要求,必須編寫《數據庫設計說明書》裏面格式包含三個部分:概念模型

Java中DateString的相互轉換

獲取 org 復制 日期類型 junit clas 時間 -m see 我們在註冊網站的時候,往往需要填寫個人信息,如姓名,年齡,出生日期等,在頁面上的出生日期的值傳遞到後臺的時候是一個字符串,而我們存入數據庫的時候確需要一個日期類型,反過來,在頁面上顯示的時候,需要從數據

C++ intstring的相互轉換

strings 構造函數 size 三種 浮點型 cout int 成員 文件 一、int轉換成string   Ⅰ、to_string函數 c++11標準增加了全局函數std::to_string: string to_string (int val); string t

python字符串列表的相互轉換

列表 log style div play gpo none split spl 1.字符串轉列表 2.列表轉字符串 1. 字符串轉列表 s =‘hello python !‘li = s.split(‘ ‘) #註意:引號內有空格print (li)輸出:[‘

Java Base64位編碼String字符串的相互轉換,Base64Bitmap的相互轉換實例代碼

format ini 幫助 byte lose IT key output val package com.duanlian.daimengmusic.utils; public final class Base64Util { private static final

線性結構樹形結構相互轉換(ES6實現)

tlist 結構 fin 更多 color {} 完整 pre ID 前言   當樹形結構的層級越來越深時,操作某一節點會變得越來越費勁,維護成本不斷增加。所以線性結構與樹形的相互轉換變得異常重要!   首先,我們約定樹形結構如下: node = { id: numb

【UML】Java代碼UML模型相互轉換方法

pap ref through 沒有 src 設計模式 ron 建模工具 好用 最近重溫了幾個設計模式,看到大家的博客裏面都是Java代碼+UML視圖,UML表達整體框架,然後再秀出具體的代碼,點面結合、一目了然。所以也研究了一下Java代碼與UML模型相互轉換方法。

【總結】使用Scala實現JsonCase Class相互轉換

json case classimport org.json4s.native.Serialization.{read, write} object Json2CaseClass extends App { implicit val formats = org.json4s.DefaultFormats