0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

計(jì)算機(jī)定點(diǎn)數(shù)據(jù)解說

冬至子 ? 來源:落木青云 ? 作者:一顆糯米 ? 2023-07-31 14:47 ? 次閱讀

回顧計(jì)算機(jī)中的數(shù)字

在學(xué)習(xí)計(jì)算機(jī)基礎(chǔ)的過程中我們已經(jīng)知道計(jì)算機(jī)是基于二進(jìn)制對數(shù)據(jù)進(jìn)行存儲和運(yùn)算的。學(xué)習(xí)C語言時(shí)我們又知道了C語言中常見的數(shù)據(jù)類型有:char,int,long intsignedunsigned 整數(shù)數(shù)據(jù),以及floatdouble型的小數(shù)數(shù)據(jù)。

或看過我之前文章的朋友肯定也明白了,無論使用何種語言編寫的何種程序,最后進(jìn)入處理器執(zhí)行的都是一串二進(jìn)制數(shù)據(jù),是不是突然又想不明白處理器到底是怎么區(qū)分這些數(shù)據(jù)類型了?這不又繞回原來說的底層邏輯了嗎,你學(xué)微機(jī)原理,學(xué)匯編指令不就是幫你解決這個(gè)問題的?回過頭去研究明白了那以后何止單片機(jī)軟件開發(fā)呢,芯片設(shè)計(jì),系統(tǒng)、編譯器開發(fā)不都能勝任了。扯遠(yuǎn)了,先回到正題。

1.jpg

對于帶小數(shù)的數(shù)據(jù)也是如此,同樣需要將十進(jìn)制數(shù)據(jù)轉(zhuǎn)為二進(jìn)制,并規(guī)定其符號位,指數(shù)位以及小數(shù)位。比如IEEE.754標(biāo)準(zhǔn)(即IEEE二進(jìn)制浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn))中對float,double存儲邏輯的規(guī)定:

1.jpg

定點(diǎn)數(shù)據(jù)

一般情況下我們會(huì)將有小數(shù)的數(shù)據(jù)稱為浮點(diǎn)型數(shù)據(jù),float為單精度浮點(diǎn)數(shù)據(jù),double為雙精度浮點(diǎn)數(shù)據(jù)。正如上面所說的我們計(jì)算機(jī)使用的是以浮點(diǎn)法保存小數(shù)型數(shù)據(jù)的。與之對應(yīng)的肯定就會(huì)有以定點(diǎn)的方式保存小數(shù)數(shù)據(jù)的方法。

定點(diǎn)是指表示一個(gè)數(shù)值時(shí),小數(shù)點(diǎn)之后的位數(shù)是固定的,有時(shí)候小數(shù)點(diǎn)之前的位數(shù)是固定的。上面用浮點(diǎn)表示的小數(shù),小數(shù)點(diǎn)的位置不是固定的,可以根據(jù)有效位數(shù)而浮動(dòng)。

圖片

浮點(diǎn)數(shù)與定點(diǎn)數(shù)表示

圖片

定點(diǎn)小數(shù)

圖片

定點(diǎn)整數(shù)

定點(diǎn)數(shù)類型的值其實(shí)就是個(gè)整數(shù),需要額外做比例進(jìn)位,進(jìn)多少位需要根據(jù)具體的定點(diǎn)數(shù)類型決定。例如 1.23 使用 1/1000 縮放系數(shù)的定點(diǎn)數(shù)表示時(shí)是 1230;1,230,000 使用 1000 縮放系數(shù)的定點(diǎn)數(shù)表示也是 1230。與浮點(diǎn)數(shù)不同,相同類型的定點(diǎn)數(shù)中所有值的縮放系數(shù)都是一致的,在計(jì)算過程中也保持不變。此表示法可以用標(biāo)準(zhǔn)的整數(shù)算術(shù)邏輯單元來進(jìn)行有理數(shù)的計(jì)算。

為了效率考量,縮放系數(shù)(scaling factor)一般會(huì)是基數(shù)b(2 或是 10)的正冪次,或是負(fù)冪次,因此實(shí)際內(nèi)部仍然可以用類似整數(shù)的方式處理。不過縮放系數(shù)也需依應(yīng)用而定。因此許多的數(shù)字可能其數(shù)值其實(shí)是用二進(jìn)制記錄,但為了使用方便人類讀寫,縮放系數(shù)仍選擇10的冪,10的冪的縮放系數(shù)也可以配合國際單位制,因?yàn)檫x擇特定的縮放系數(shù),可能相當(dāng)于使用另外一個(gè)大小較適合的單位,例如使用厘米或微米,而不是使用米,或者是以1/3600為縮放系數(shù)的定點(diǎn)數(shù)來表示以小時(shí)為單位的時(shí)間值,精確到秒。

采用定點(diǎn)計(jì)數(shù)法時(shí),相鄰兩個(gè)數(shù)之差總是等于其中一個(gè)數(shù)的值,而采用浮點(diǎn)計(jì)數(shù)法時(shí),相鄰數(shù)并不是均勻分布的。另外浮點(diǎn)計(jì)數(shù)的計(jì)數(shù)范圍是比定點(diǎn)計(jì)數(shù)范圍要大得多,并且一般場景中浮點(diǎn)計(jì)數(shù)精度往往也比定點(diǎn)計(jì)數(shù)精度高,正因?yàn)槿绱耍话闱闆r下浮點(diǎn)計(jì)數(shù)法更適合于一般應(yīng)用場景,一般老師在課堂上也不會(huì)做詳細(xì)介紹,所以我們對定點(diǎn)數(shù)感到陌生也完全不奇怪。

所以現(xiàn)在大多數(shù)處理器芯片都是帶有浮點(diǎn)運(yùn)算器(FPU),只有在特殊的應(yīng)用中才使用定點(diǎn)數(shù)運(yùn)算,例如某些特定應(yīng)用下的數(shù)字信號處理芯片(DSP)或一些低價(jià)的嵌入式系統(tǒng)微處理器MCU),這類的應(yīng)用強(qiáng)調(diào)高需求速度,低電力需求及小集成電路區(qū)域,例如影像、視頻或圖片等數(shù)字信號處理,進(jìn)行傅里葉變換以及數(shù)字濾波器設(shè)計(jì),或是其他一些這種數(shù)字表示法比較適合的場景,如貨幣計(jì)算,儀器測量計(jì)數(shù)等,這些都是有特定的精度規(guī)則,使用浮點(diǎn)計(jì)數(shù)反而可能帶來更大的芯片資源消耗或成本開支,并且這些情況運(yùn)算速度也不如定點(diǎn)運(yùn)算快。

1.jpg

1.jpg

當(dāng)然平時(shí)使用時(shí)我們也可以編寫一些特定程序?qū)@些格式表示的數(shù)值范圍進(jìn)行驗(yàn)證。

#include < stdio.h >
#include < stdint.h >
#include < math.h >

int main()
{
    int16_t q_max = 32767; // 0x7FFF
    int16_t q_min = -32768; // 0x8000
    float f_max = 0;
    float f_min = 0;
    printf("rn");
    for (int8_t i = 15; i >=0; i--) 
    {
        f_max = (float)q_max / pow(2,i);
        f_min = (float)q_min / pow(2,i);

        printf("t|Q%dt|Q%d.%dt|%ft|%ft|rn",
               i,(15-i),i,f_max,f_min);
    }
    return 0;
}

1.jpg

定點(diǎn)與浮點(diǎn)相互轉(zhuǎn)化

在一些功能復(fù)雜的處理器中會(huì)同時(shí)支持兩種數(shù)據(jù)處理方式,比如STM32G4系列的芯片上攜帶的FMAC(filtermath accelerator)支持的定點(diǎn)DSP處理功能,使用的定點(diǎn)格式為Q1.15。

在這種既有定點(diǎn)運(yùn)算又有浮點(diǎn)運(yùn)算是處理器上做開發(fā)時(shí)我們不可避免的都會(huì)涉及到定點(diǎn)與浮點(diǎn)相互轉(zhuǎn)化的問題,這時(shí)需要注意進(jìn)行處理數(shù)據(jù)!

1.jpg

定點(diǎn)運(yùn)算思的擴(kuò)展

在某些特定情況下定點(diǎn)運(yùn)算對算法的效率優(yōu)化有著出奇的效果,如果你對這方面感興趣不妨可以研究一下經(jīng)典的快速平方根算法。

另外,我們平時(shí)做單片機(jī)開發(fā)時(shí)在一些比較低端的芯片中,比如C51單片機(jī),請切記不要輕易使用浮點(diǎn)運(yùn)算!如果需要進(jìn)行小數(shù)運(yùn)算,我們可以借助定點(diǎn)運(yùn)算是思想在程序中通過設(shè)計(jì)一定的比例系數(shù)對數(shù)據(jù)進(jìn)行放大或縮小處理,從而實(shí)現(xiàn)某些功能。不要問我為啥,舉個(gè)簡單的例子,利用超聲波模塊測距,你自己寫兩個(gè)程序,一個(gè)使用浮點(diǎn),一個(gè)不使用做個(gè)實(shí)驗(yàn)測試一下就可以知道結(jié)果是怎么的了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10900

    瀏覽量

    356093
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136864
  • 信號處理器
    +關(guān)注

    關(guān)注

    1

    文章

    254

    瀏覽量

    25276
  • 傅里葉變換
    +關(guān)注

    關(guān)注

    6

    文章

    441

    瀏覽量

    42601
  • 浮點(diǎn)運(yùn)算器

    關(guān)注

    0

    文章

    4

    瀏覽量

    5751
收藏 人收藏

    評論

    相關(guān)推薦

    點(diǎn)數(shù)定點(diǎn)數(shù)

    本帖最后由 gk320830 于 2015-3-5 23:17 編輯 數(shù)制,浮點(diǎn)數(shù)定點(diǎn)數(shù)的文檔,上數(shù)電時(shí)老師給的。有興趣的同學(xué)可以來看看
    發(fā)表于 03-27 21:31

    【安富萊——DSP教程】第7章 DSP定點(diǎn)數(shù)和浮點(diǎn)數(shù)(重要)

    第7章DSP定點(diǎn)數(shù)和浮點(diǎn)數(shù)(重要) 本期教程主要跟大家講解一下定點(diǎn)數(shù)和浮點(diǎn)數(shù)的基礎(chǔ)知識,了解這些基礎(chǔ)知識對于后面學(xué)習(xí)ARM官方的DSP庫大有裨益。特別是初學(xué)的一定要理解這些基礎(chǔ)知識。
    發(fā)表于 06-03 11:47

    第7章 DSP定點(diǎn)數(shù)和浮點(diǎn)數(shù)

    。7.1.2 浮點(diǎn)數(shù)計(jì)算機(jī)系統(tǒng)的發(fā)展過程中,曾經(jīng)提出過多種方法表達(dá)實(shí)數(shù)。典型的比如相對于浮點(diǎn)數(shù)定點(diǎn)數(shù)(Fixed Point Number)。在這種表達(dá)方式中,小數(shù)點(diǎn)固定的位于實(shí)
    發(fā)表于 09-22 13:02

    請問28335浮點(diǎn)數(shù)使用IQmath轉(zhuǎn)換后當(dāng)定點(diǎn)數(shù)計(jì)算快還是用浮點(diǎn)數(shù)進(jìn)行計(jì)算快?28335可以定點(diǎn)浮點(diǎn)混合編程嗎?

    本帖最后由 一只耳朵怪 于 2018-6-14 11:52 編輯 28335為浮點(diǎn)DSP ,現(xiàn)在假如我采用兩種方法:1.浮點(diǎn)數(shù)使用IQmath轉(zhuǎn)換后當(dāng)定點(diǎn)數(shù)計(jì)算2.直接用浮點(diǎn)數(shù)進(jìn)
    發(fā)表于 06-14 05:59

    6618虛擬定點(diǎn)數(shù)學(xué)庫IQmath

    最近需要在6618上做速度優(yōu)化,準(zhǔn)備采用定點(diǎn)代替浮點(diǎn)的方式,但是沒有找到針對66X系列的虛擬定點(diǎn)數(shù)學(xué)庫。采用C64+系列的定點(diǎn)虛擬庫代替,發(fā)現(xiàn)32bit數(shù)據(jù)的乘法速度竟然比直接進(jìn)行浮點(diǎn)
    發(fā)表于 06-21 11:23

    verilog程序定點(diǎn)數(shù)的資料

    verilog程序中需要用到定點(diǎn)數(shù),用浮點(diǎn)數(shù)太復(fù)雜。。。有誰有關(guān)于定點(diǎn)數(shù)比較系統(tǒng)的資料嗎。。。我找到黑金的教程,是關(guān)于浮點(diǎn)數(shù)運(yùn)算的verilog實(shí)現(xiàn),很詳細(xì),先傳上來 Verilog
    發(fā)表于 03-27 06:35

    DSP功能函數(shù)-定點(diǎn)數(shù)互轉(zhuǎn)

    第17章 DSP功能函數(shù)-定點(diǎn)數(shù)互轉(zhuǎn)本期教程主要講解功能函數(shù)中的Q7,Q15和Q31分別向其它類型數(shù)據(jù)轉(zhuǎn)換。目錄第17章 DSP功能函數(shù)-定點(diǎn)數(shù)互轉(zhuǎn)17.1 初學(xué)者重要提示17.2 DSP基礎(chǔ)運(yùn)算指令17.3 ...
    發(fā)表于 08-11 08:04

    定點(diǎn)數(shù)運(yùn)算中產(chǎn)生溢出的原因是什么

    馮·諾依曼機(jī)工作方式的基本特點(diǎn)是什么?計(jì)算機(jī)系統(tǒng)中采用補(bǔ)碼運(yùn)算的目的是什么?在定點(diǎn)二進(jìn)制運(yùn)算器中,減法運(yùn)算一般通過什么來實(shí)現(xiàn)?在定點(diǎn)數(shù)運(yùn)算中產(chǎn)生溢出的原因是什么?和外存儲器相比,內(nèi)存儲器的特點(diǎn)是什么?
    發(fā)表于 08-11 08:44

    功能函數(shù)中的浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)

    第16章 DSP功能函數(shù)-數(shù)據(jù)拷貝,數(shù)據(jù)填充和浮點(diǎn)轉(zhuǎn)定點(diǎn)本期教程主要講解功能函數(shù)中的數(shù)據(jù)拷貝,數(shù)據(jù)填充和浮
    發(fā)表于 08-17 07:37

    定點(diǎn)數(shù)和浮點(diǎn)數(shù)的區(qū)別是什么

    定點(diǎn)數(shù)和浮點(diǎn)數(shù)的區(qū)別目的:理解定點(diǎn)數(shù)和浮點(diǎn)數(shù)在傅里葉變換(FFT)的實(shí)際應(yīng)用中的選擇單片機(jī)中如果需要進(jìn)行一定的運(yùn)算(常見的傅里葉變換)時(shí),需要在不同情況下對AD采集的
    發(fā)表于 02-21 07:22

    請問ADSP-21469的匯編指令集ISA/VISA中有沒有專門用來進(jìn)行浮點(diǎn)數(shù)定點(diǎn)數(shù)轉(zhuǎn)換的指令?

    得到的ADC數(shù)據(jù)需要進(jìn)行定點(diǎn)數(shù)到浮點(diǎn)數(shù)的轉(zhuǎn)換,為了節(jié)省開銷,想使用匯編程序進(jìn)行定點(diǎn)和浮點(diǎn)之間的轉(zhuǎn)換。請問ADSP-21469的匯編指令集ISA/VISA中有沒有專門用來進(jìn)行浮
    發(fā)表于 11-29 08:03

    LabVIEW中定點(diǎn)數(shù)有什么用途?LabVIEW中定點(diǎn)數(shù)應(yīng)用解析

    什么是定點(diǎn)數(shù) 顧名思義,在運(yùn)算中小數(shù)點(diǎn)始終不會(huì)發(fā)生移動(dòng)的數(shù)就是定點(diǎn)數(shù)。對于定點(diǎn)數(shù),我們定義了其一共占有的bit位數(shù)以及小數(shù)點(diǎn)的位置,不同格式的定點(diǎn)數(shù)可以表達(dá)的
    發(fā)表于 11-16 13:04 ?9096次閱讀
    LabVIEW中<b class='flag-5'>定點(diǎn)數(shù)</b>有什么用途?LabVIEW中<b class='flag-5'>定點(diǎn)數(shù)</b>應(yīng)用解析

    在FPGA里浮點(diǎn)數(shù)定點(diǎn)數(shù)表示法原理展示

    點(diǎn)數(shù)定點(diǎn)數(shù)表示法是我們在計(jì)算機(jī)中常用的表示方法 所以必須要弄懂原理,特別是在FPGA里面,由于FPGA不能像在MCU一樣直接用乘除法。 首先說一下簡單的定點(diǎn)數(shù),
    發(fā)表于 11-18 02:15 ?8778次閱讀
    在FPGA里浮<b class='flag-5'>點(diǎn)數(shù)</b>與<b class='flag-5'>定點(diǎn)數(shù)</b>表示法原理展示

    定點(diǎn)數(shù)和浮點(diǎn)數(shù)在STM32單片機(jī)中使用傅里葉(FFT)變換的理解

    定點(diǎn)數(shù)和浮點(diǎn)數(shù)的區(qū)別目的:理解定點(diǎn)數(shù)和浮點(diǎn)數(shù)在傅里葉變換(FFT)的實(shí)際應(yīng)用中的選擇單片機(jī)中如果需要進(jìn)行一定的運(yùn)算(常見的傅里葉變換)時(shí),需要在不同情況下對AD采集的
    發(fā)表于 12-24 19:22 ?16次下載
    <b class='flag-5'>定點(diǎn)數(shù)</b>和浮<b class='flag-5'>點(diǎn)數(shù)</b>在STM32單片機(jī)中使用傅里葉(FFT)變換的理解

    FPGA定點(diǎn)數(shù)截位的基本準(zhǔn)則

    FPGA內(nèi)部表示正負(fù)數(shù),小數(shù)的規(guī)則。兩者相比之下,定點(diǎn)數(shù)實(shí)現(xiàn)簡單,表達(dá)更為直觀,所以在很多時(shí)候FPGA通常使用定點(diǎn)數(shù)表示小數(shù)。
    發(fā)表于 06-19 10:44 ?1523次閱讀
    FPGA<b class='flag-5'>定點(diǎn)數(shù)</b>截位的基本準(zhǔn)則