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

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

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

關(guān)于浮點(diǎn)數(shù)和定點(diǎn)數(shù)的相互轉(zhuǎn)換技術(shù)探討

454398 ? 來源:FPGA開源工作室 ? 作者:FPGA開源工作室 ? 2020-10-09 16:28 ? 次閱讀

1. 這篇博客將要討論什么?

說來慚愧,作為計(jì)算機(jī)科班出身的人,計(jì)算機(jī)基礎(chǔ)知識(shí)掌握并不扎實(shí),這里的基礎(chǔ)指的是計(jì)算機(jī)體系結(jié)構(gòu)中的內(nèi)容,諸如數(shù)據(jù)的表示和處理,如float的表示和運(yùn)算等。看《CSAPP》方知人家老外把這個(gè)東西當(dāng)成重中之重,大量詳細(xì)的原理介紹,并配套大量例題。當(dāng)初本科學(xué)的時(shí)候,很簡(jiǎn)單的了解了下概念而已,所以應(yīng)該直接將《CSAPP》當(dāng)做教材來用,里面習(xí)題全做,這樣CS出來的基本知識(shí)將掌握的很扎實(shí)。

學(xué)藝不精的后果就在于:學(xué)而不思則罔。圣人太厲害了,總結(jié)得很到位。比如最近項(xiàng)目中涉及到浮點(diǎn)和定點(diǎn)的轉(zhuǎn)換,自己就有點(diǎn)蒙,邊看邊實(shí)驗(yàn),還算理解了,作文以記之。

一直以來,程序中接觸的數(shù)據(jù)類型都是int整型,char字符型,float單精度浮點(diǎn)型,double雙精度浮點(diǎn)型??吹礁↑c(diǎn)和定點(diǎn)一直不知道如何劃分這個(gè)概念的范疇。以為浮點(diǎn)就是float表示小數(shù),定點(diǎn)就是int可表示整數(shù)而已。經(jīng)過學(xué)習(xí)明白了顯然是錯(cuò)誤的。應(yīng)該是這樣劃分的:

浮點(diǎn):小數(shù)點(diǎn)非固定的數(shù),可表示數(shù)據(jù)范圍較廣,整數(shù),小數(shù)都可表示。包含float,double;

定點(diǎn):小數(shù)點(diǎn)固定,可表示整數(shù),小數(shù)。int本質(zhì)是小數(shù)點(diǎn)位于末尾的32位定點(diǎn)數(shù)而已;

有了這個(gè)認(rèn)識(shí),后面的討論就可以開始了。

2. 浮點(diǎn)數(shù)的表示法

浮點(diǎn)數(shù)以float為例討論。

2.1 IEEE 754標(biāo)準(zhǔn)

規(guī)定浮點(diǎn)數(shù)格式為:
圖片居中使用:

s表示符號(hào)位,當(dāng)s=0,V為正數(shù);當(dāng)s=1,V為負(fù)數(shù)

M表示尾數(shù),2>M>=1

E表示階碼

將其封裝到32位的字中:

根據(jù)32位數(shù)計(jì)算為十進(jìn)制:

可以得出以下結(jié)論:

浮點(diǎn)數(shù)表示比整型那些更為復(fù)雜。如int中0…01000表示8,0…01001表示9,而浮點(diǎn)不能這樣簡(jiǎn)單。

浮點(diǎn)數(shù)不能移位。因?yàn)楦鱾€(gè)位有特殊含義。像int數(shù)乘2可以左移1位實(shí)現(xiàn)。

2.2 浮點(diǎn)數(shù)的“浮”字體現(xiàn)在哪里?

我們說浮點(diǎn)數(shù)的小數(shù)點(diǎn)不是固定的,是浮動(dòng)的,那么如何理解?通過例子可直觀體驗(yàn)。

這個(gè)浮點(diǎn)數(shù)表示十進(jìn)制的1.125

若階碼不變,尾數(shù)加1,則表示十進(jìn)制的1.25

若尾數(shù)不變,階碼加1,則表示十進(jìn)制的2.25

3. 定點(diǎn)數(shù)的表示法

對(duì)于計(jì)算機(jī)來說,浮點(diǎn)定點(diǎn)的概念是看不見的,因?yàn)樗荒芸吹剑?…00001110,至于它表示多少,是邏輯層面的設(shè)置。你如果讓它是int那就按照int表示法對(duì)每個(gè)位賦予意義,如果你讓它是float就按照float表示法賦予意義。

對(duì)于000111000001110000011100表示的定點(diǎn)數(shù):

如果我們?cè)O(shè)定小數(shù)點(diǎn)是位于最后一位的,即00011100.00011100.00011100.則其表示28

若設(shè)定小數(shù)點(diǎn)位于后三位的,即00011.10000011.10000011.100則其表示3.50

若設(shè)定小數(shù)點(diǎn)位于后四位的,即0001.11000001.11000001.1100則其表示1.75

可以看到:

小數(shù)位數(shù)越多,表示的精度越高。若小數(shù)點(diǎn)后有n位,則其表示的最大精度為

1/(2n);

整數(shù)位數(shù)越多,可表示的最大值越大。

以8位為例,最高位為符號(hào)位:

若整數(shù)位占4位,小數(shù)位占3位,則其最大精度為0.125,最大值為15.875

若整數(shù)位占5位,小數(shù)位占2位,則其最大精度為0.250,最大值為31.750

若整數(shù)位占6位,小數(shù)位占1位,則其最大精度為0.500,最大值為63.500

若整數(shù)位占7位,小數(shù)位占0位,則其最大精度為1.000,最大值為127

4. 浮點(diǎn)數(shù) & 定點(diǎn)數(shù)

4.1 為何要把浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)呢?

這來源于項(xiàng)目中神經(jīng)網(wǎng)絡(luò)的需求,網(wǎng)絡(luò)中大量的參數(shù),如果全部用F32表示,一是占用空間大,二是讀取效率不高。

如果我們可以將某些浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)表示,在接受精度損失的前提下,每次就可以讀取多個(gè)進(jìn)行運(yùn)行,可顯著提高運(yùn)算效率。

舉例來說,我們用8位定點(diǎn)數(shù),1個(gè)符號(hào)位,4個(gè)整數(shù)位,3個(gè)小數(shù)位,則其可表示范圍是-16.00~15.875,最大精度0.125。

有幾個(gè)浮點(diǎn)數(shù):0.145,1.231,2.364,7.512,每個(gè)需要32bit表示。

如果我們將每個(gè)量化成一個(gè)8位定點(diǎn)數(shù),比如通過某種方法得到:1,10,19,60

此時(shí)每個(gè)數(shù)需要8bit表示。那么讀一個(gè)浮點(diǎn)數(shù),可以同時(shí)讀4個(gè)定點(diǎn)數(shù),且計(jì)算效率可以提高。當(dāng)然這樣做是有風(fēng)險(xiǎn)的:

損失精度,比如再將上述定點(diǎn)數(shù)轉(zhuǎn)化為浮點(diǎn)數(shù):0.125,1.250, 2.375,7.500;

定點(diǎn)數(shù)表示范圍有限,加法有可能會(huì)溢出,需要拿int16或int32來暫存中間結(jié)果;

4.2 如何將浮點(diǎn)數(shù)轉(zhuǎn)換為定點(diǎn)數(shù)?

我們用8位定點(diǎn)數(shù),1個(gè)符號(hào)位,4個(gè)整數(shù)位,3個(gè)小數(shù)位。這個(gè)3稱為量化系數(shù)。該過程稱為量化。

(我們總是將非離散值量化到離散值空間,處理更為簡(jiǎn)單)

Int8=float32*2(3)

如:

Int8(10)=float32(1.231)*2(3)

4.3 如何將定點(diǎn)數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)?

該過程稱為反量化。

Float32=int8/2(3)

如:

Float32(1.250)=int8(10)/2(3)

4.4 note

可以這樣理解:量化系數(shù) nnn 決定了我們邏輯上認(rèn)為01序列中可表示的單位值 1/(2n),CPU讀取的數(shù)字表示有多少份單位值。

舉例來說,對(duì)于固定的01序列值:0001,1100

同樣的int8數(shù),因?yàn)榱炕禂?shù)的不同,代表著不同的f32值。

還有個(gè)note:

定點(diǎn)數(shù)加減時(shí)需要量化系數(shù)相同,其值有可能溢出,需要更大定點(diǎn)數(shù)來暫存中間值;

兩個(gè)定點(diǎn)數(shù)乘法后如果需要轉(zhuǎn)化為f32,則反量化系數(shù)變?yōu)??n

5. 總結(jié)

可以看到:

浮點(diǎn)數(shù)和定點(diǎn)數(shù)的轉(zhuǎn)換是一種映射。將較為密集的數(shù)據(jù)空間(F32)映射到較為稀疏的空間(int8);

定點(diǎn)數(shù)的小數(shù)點(diǎn)實(shí)際中是沒有的,這只是我們邏輯上的一種設(shè)定。01序列是一樣的,CPU讀取都是相同的,因?yàn)槲覀冞壿嬌闲?shù)點(diǎn)的不同位置,我們認(rèn)為它代表的值是不同的;

作者:鳥戀舊林XD

原文鏈接:https://blog.csdn.net/niaolianjiulin/article/details/82764511

最后給大家一個(gè)在線的轉(zhuǎn)換工具:

https://www.h-schmidt.net/FloatConverter/IEEE754.html

示例:將浮點(diǎn)數(shù)55.12345轉(zhuǎn)換為32bit

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

    評(píng)論

    相關(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ǔ)知識(shí),了解這些基礎(chǔ)知識(shí)對(duì)于后面學(xué)習(xí)ARM官方的DSP庫大有裨益。特別是初學(xué)的一定要理解這些基礎(chǔ)知識(shí)。
    發(fā)表于 06-03 11:47

    labview里單精度浮點(diǎn)數(shù)和十六進(jìn)制數(shù)如何相互轉(zhuǎn)換?

    我需要將一個(gè)單精度的浮點(diǎn)數(shù)(如0.33)轉(zhuǎn)換為十六進(jìn)制數(shù)然后通過串口發(fā)送,同時(shí)還需將串口讀取的十六進(jìn)制數(shù)轉(zhuǎn)換為單精度浮點(diǎn)數(shù)。 求問在labview里如何使
    發(fā)表于 10-14 11:04

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

    轉(zhuǎn)dsp系列教程本期教程主要跟大家講解一下定點(diǎn)數(shù)浮點(diǎn)數(shù)的基礎(chǔ)知識(shí),了解這些基礎(chǔ)知識(shí)對(duì)于后面學(xué)習(xí)ARM官方的DSP庫大有裨益。特別是初學(xué)的一定要理解這些基礎(chǔ)知識(shí)。 7.1 定點(diǎn)數(shù)浮點(diǎn)數(shù)
    發(fā)表于 09-22 13:02

    請(qǐng)問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)換
    發(fā)表于 07-24 07:21

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

    verilog程序中需要用到定點(diǎn)數(shù),用浮點(diǎn)數(shù)太復(fù)雜。。。有誰有關(guān)于定點(diǎn)數(shù)比較系統(tǒng)的資料嗎。。。我找到黑金的教程,是關(guān)于
    發(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)
    發(fā)表于 08-11 08:04

    功能函數(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ù)填充和浮點(diǎn)數(shù)轉(zhuǎn)換定點(diǎn)數(shù)。目錄第16章 D
    發(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í),需要在不同情況下對(duì)AD采集的數(shù)據(jù)進(jìn)行一定的處理
    發(fā)表于 02-21 07:22

    請(qǐng)問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)換
    發(fā)表于 11-29 08:03

    功能:雙字節(jié)十六進(jìn)制定點(diǎn)數(shù)轉(zhuǎn)換成格式化浮點(diǎn)數(shù)

    功能:雙字節(jié)十六進(jìn)制定點(diǎn)數(shù)轉(zhuǎn)換成格式化浮點(diǎn)數(shù) 入口條件:雙字節(jié)定點(diǎn)數(shù)的絕對(duì)值在[R0]中,數(shù)符在位1FH中,整數(shù)部分的位數(shù)在A中。
    發(fā)表于 01-19 22:45 ?3147次閱讀

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

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

    單片機(jī)浮點(diǎn)數(shù)運(yùn)算的源碼設(shè)計(jì)

    單片機(jī)執(zhí)行程序的過程,實(shí)際上就是執(zhí)行我們所編制程序的過程。即逐條指令的過程。本文詳細(xì)介紹了浮點(diǎn)數(shù)在單片機(jī)中的表示方式和匯編子程序,浮點(diǎn)數(shù)定點(diǎn)數(shù)加減法要困難,但是克服了定點(diǎn)數(shù)表示范圍小
    的頭像 發(fā)表于 03-07 15:19 ?1w次閱讀
    單片機(jī)<b class='flag-5'>浮點(diǎn)數(shù)</b>運(yùn)算的源碼設(shè)計(jì)

    定點(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í),需要在不同情況下對(duì)AD采集的數(shù)據(jù)進(jìn)行一定的處理
    發(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)變換的理解

    定點(diǎn)數(shù)浮點(diǎn)數(shù)的概念 浮點(diǎn)數(shù)二進(jìn)制序列與指數(shù)表達(dá)式之間的轉(zhuǎn)化

    的缺點(diǎn):由于小數(shù)點(diǎn)位置固定不變,定點(diǎn)數(shù)所表示的數(shù)的范圍非常有限,不能同時(shí)表達(dá)特別大或特別小的數(shù),所以才出現(xiàn)了浮點(diǎn)數(shù),以此來擴(kuò)充數(shù)的范圍,同時(shí)浮點(diǎn)數(shù)也廣泛應(yīng)用于精度要求高的場(chǎng)合。簡(jiǎn)單的理解浮點(diǎn)數(shù)
    的頭像 發(fā)表于 08-22 16:06 ?7604次閱讀
    <b class='flag-5'>定點(diǎn)數(shù)</b>和<b class='flag-5'>浮點(diǎn)數(shù)</b>的概念 <b class='flag-5'>浮點(diǎn)數(shù)</b>二進(jìn)制序列與指數(shù)表達(dá)式之間的轉(zhuǎn)化