• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 測試測量 > 設計應用 > 一種基于模板元編程的量綱檢測方法

    一種基于模板元編程的量綱檢測方法

    作者: 時間:2009-07-14 來源:網絡 收藏
    0 引 言
    量綱誤用在科學計算程序中是一種常見的錯誤,然而程序設計語言的標準類型系統卻對此無能為力。物理方程中的量綱錯誤可以手工分析出來,然而求解物理方程的計算機程序中的量綱錯誤卻難以被發現,因為計算程序往往很復雜。例如,一些研究者認為火星氣候探測衛星的丟失,是因為程序中把一個英制單位的變量傳遞給了使用公制單位的模塊。因而,量綱的正確性對計算結果的正確性非常重要。
    近年來,研究者們提出了一些量綱,典型的如Osprey量綱。Osprey方法包含5個主要步驟:
    (1)對待檢測源程序進行單位標注,使得檢測器能夠知道每個變量的單位;
    (2)C語言解析和語法檢查;
    (3)生成包含單位信息的抽象語法樹;
    (4)生成約束CY程);
    (5)方程的化簡及高斯消去求解(GE)。
    可以看出,Osprey方法步驟較多,每步都需要語言外的其他工具,并需要對其進行修改、擴充,而且最后的高斯消去(GE)計算量非常大,是Osprey方法的性能瓶頸。使用Osprey方法還有一個問題,就是需要同時維護2份源代碼:一份正常代碼用于編譯測試;另一份包含量綱信息的檢測代碼,修改正常代碼后必須及時對檢測代碼進行更新,維護起來也比較繁瑣。此外,由于C++語言的解析非常困難,Osprey方法目前沒有實現對C++程序的量綱檢測。
    針對這些問題,提出一種基于的量綱TADA(TMP-bAsed Dimensional AnalysisMethod),其基本思路是利用程序設計語言自身的(Template Meta Programming,TMP)功能,讓編譯器在編譯時對程序中的量綱進行準確性檢測,從而可以避免Osprey方法的計算量大等諸多問題。TADA方法具有下列優點:
    (1)TADA方法可使得應用開發人員不需要維護2份代碼,因為使用TADA方法的檢測程序也完全是一個合法的可編譯的程序。
    (2)TADA方法的量綱檢測完全在編譯期間進行,對程序不會引入任何運行時開銷。
    (3)TADA方法無需進行方程組求解工作,可以適用于任何規模的程序。與Osprey等方法類似,TADA方法也需要手工對程序添加量綱信息,其標注的工作量與Osprey等方法相當。但TADA方法中編譯器在進行檢測的時候無需進行Osprey方法中的方程組求解工作,因而不再有Osprey方法的計算瓶頸。
    (4)TADA方法采用模塊化設計,使得單位的表示與匹配檢測之間實現了松耦合,支持用戶可以以一致的方式增加新的單位。

    1 (TMP)技術
    在C++程序設計語言中,模板元編程是實現代碼重用的一種重要機制。下面首先對模板元編程技術進行介紹,然后給出TADA方法中需要使用的幾個基本的模板元程序。
    1.1 模板元編程簡介
    模板可以將類型定義為參數,以提高代碼的可重用性。模板包括類模板和函數模板等。函數模板與模板函數的區別可以類比于類與對象的區別:函數模板是模板的定義;而模板函數是函數模板的實例,具有程序代碼,占用內存空間。當編譯系統發現了函數模板一個對應的函數調用后,根據實參的類型來確認是否匹配函數模板中對應的形參,然后生成一個重載函數,稱該重載函數為模板函數。類似地,在聲明了一個類模板后,也可以創建類模板的實例一模板類。
    類模板的一般形式如下:
    template
    class類名{
    //類定義…

    本文引用地址:http://www.czjhyjcfj.com/article/195807.htm

    };
    C++模板系統能夠通過模板的特化、偏特化實現邏輯判斷,并能通過模板遞歸實現循環,構成了一個圖靈完全的二級語言。使用這種二級語言進行編程叫作C++模板元編程(Template Meta Programming,TMP)。模板元編程的驅動力是模板的遞歸實例化。
    下面給出C++模板元編程的一個示例。
    首先定義一個類模板,通過該類模板可實現在編譯期間計算4的任意次方。如下所示:

    通過下面的程序來使用該模板。


    程序Test.cpp執行完后,會正確輸出4的7次方的值,該數值是C++編譯器在編譯模板元程序時遞歸計算得到。由于模板元程序完全在編譯期間執行,相當于對編譯器功能進行擴充,因而利用這種程序進行量綱檢測具有良好的可行性。
    1.2 基本模板元程序
    下面給出TADA方法中需要使用的幾個基本的模板元程序。
    (1)靜態判斷


    語法:StaticlFcond,T1,T2>::ResultType
    語義:當cond為真時,ResuhType為T1,否則ResuhType為T2。
    (2)靜態斷言


    語義:當cond為真時什么也不做,否則產生一個編譯期錯誤(UnitError沒有定義,或void函數不應該有返回值)。
    (3)靜態絕對值


    語義:遞歸的使用輾轉相除法在編譯期間求出a與b的最大公約數,其中a與b為int類型。

    2 TADA量綱檢測方法
    TADA量綱檢測方法需要涉及到單位和量綱的表示、計算、標注以及數學運算函數的量綱包裝等各個組成步驟,下面將依次對其進行介紹。
    2.1 單位和量綱的表示
    在Osprey方法中,量綱是用一個長度為7的向量表示的,每個分量對應一個SI標準量綱。TADA方法中也采用了這種方式。為了簡化闡述,本文只討論長度、重量、時間這三種量綱,其SI單位分別為米、千克和秒(TADA方法可直接推廣到其他各種量綱)。由于TMP程序的特殊性,它并沒有數組或向量的支持,也不能使用浮點數據(使用浮點數表示量綱也會帶來不精確性),量綱在TMP程序中的表示形式有所不同:用u11,u12,u21,u22,u31,u32之類的整型量分別表示,并輔以ratio表示同量綱、不同單位之間的比值,如分鐘和秒的比值為60。
    TADA方法可靜態地建立如下常用單位:


    模板元程序在計算公式的時候需要推導出新的量綱,例如在計算的時候,編譯器應該能根據等號右邊的公式計算出它的量綱,并與e的量綱進行比較判別。TADA方法的量綱是用分數形式表示的,在每次量綱計算之后都需要進行分數的約分處理,才能進行相等性判斷,因而TADA方法可用如下的方式處理新生成單位,如下所示。



    上一頁 1 2 3 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 城步| 十堰市| 缙云县| 开原市| 合阳县| 靖西县| 荃湾区| 安泽县| 上饶市| 巴南区| 石首市| 重庆市| 故城县| 中牟县| 剑川县| 获嘉县| 镇江市| 海林市| 昂仁县| 南投市| 敦化市| 和顺县| 浑源县| 信宜市| 广灵县| 土默特左旗| 凉城县| 尤溪县| 黔西县| 综艺| 岚皋县| 介休市| 花莲市| 府谷县| 克什克腾旗| 腾冲县| 东辽县| 宝坻区| 康保县| 浦城县| 连城县|