科學(xué)計(jì)數(shù)法
你可能不了解「浮點(diǎn)數(shù)」,但你一定了解「科學(xué)記數(shù)法」。
10進(jìn)制科學(xué)記數(shù)法把一個(gè)數(shù)表示成a與10的n次冪相乘的形式(1≤|a|<10,a不為分?jǐn)?shù)形式,n為整數(shù)),例如:
19970000000000 = 1.997 × 10 ^ 13
原本的 19970000000000 表示共需要14位。使用科學(xué)計(jì)數(shù)法后,小數(shù)部分 1.997 的表示需要4位,指數(shù)部分 13 需要2位,則一共只需要 4+2 = 6 位即可表示這個(gè)原本看上去很多很長的數(shù)。
小數(shù)也可以使用科學(xué)計(jì)數(shù)法來表示,例如:
0.0000001586 = 1.586 × 10 ^ -7
原本的 0.0000001586 表示共需要11位。使用科學(xué)計(jì)數(shù)法后,小數(shù)部分 1.586 的表示需要4位,指數(shù)部分 -7 需要2位(符號(hào)位也占一位),則一共只需要 4+2 = 6 位即可表示該數(shù)。
設(shè)想我們現(xiàn)在設(shè)計(jì)了這么一種格式,它表示的是一種10進(jìn)制的科學(xué)計(jì)數(shù)法。為了說明簡單,我們不考慮指數(shù)為負(fù)數(shù)和數(shù)值為負(fù)數(shù)的情況。它一共有8位,每一位都由10進(jìn)制數(shù)字0~9組成,前6位表示小數(shù)部分,后2位表示指數(shù)部分。例如:
數(shù)字 12345603 ,它表示的值是 1.23456 × 10 ^ 3 = 1234.56
數(shù)字 12345678 ,它表示的值是 1.23456 × 10 ^ 78 = (一個(gè)很大的數(shù))
所以,當(dāng)我們要表示或運(yùn)算某個(gè)較大或較小且位數(shù)較多的數(shù)時(shí),用科學(xué)記數(shù)法會(huì)更加方便。
在關(guān)于定點(diǎn)數(shù)的這篇文章《什么是定點(diǎn)數(shù)?》中,我們談到了什么是「定點(diǎn)數(shù)」。簡而言之,定點(diǎn)數(shù)就是小數(shù)點(diǎn)表示固定的數(shù)。那么對(duì)應(yīng)的,「浮點(diǎn)數(shù)」是不是就是小數(shù)點(diǎn)不固定?是浮動(dòng)的?
恭喜你答對(duì)了。
「浮點(diǎn)數(shù)」一詞,來自英文「float point number」,即「浮動(dòng)小數(shù)點(diǎn)的數(shù)」。和上面所說的科學(xué)計(jì)數(shù)法類似,它們的小數(shù)點(diǎn)位置都是浮動(dòng)的。
和10進(jìn)制的科學(xué)計(jì)數(shù)法一樣,2進(jìn)制數(shù)也可以表示成類似的形式,例如:
101.875(D) = 1100101.111(B) = 1.100101111 * 2^6
所以只需要約定好一定的位數(shù)來表示小數(shù)部分,一定的位數(shù)來表示指數(shù)部分,就可以完整地表示一個(gè)二進(jìn)制數(shù)。如何定義這些細(xì)節(jié)是個(gè)傷腦筋的問題,而且要命的是,如果我定義的標(biāo)準(zhǔn)和同事的標(biāo)準(zhǔn)不一致,那么該聽誰的?
好在IEEE(電氣與電子工程師協(xié)會(huì),Institute of Electrical and Electronics Engineers)幫我們把這些工作都給做了,現(xiàn)在通用的浮點(diǎn)數(shù)算術(shù)標(biāo)準(zhǔn)是「IEEE 754」。
浮點(diǎn)數(shù)格式
IEEE 754 規(guī)定了兩種常用的浮點(diǎn)數(shù)格式:
單精度型,也叫32位型,或者float
雙精度型,也叫64位型,或者double
因?yàn)檫@兩種格式的表示規(guī)則是類似的,只是位寬不一樣,了解了其中一種后,就可以快速掌握另一種,所以下文主要介紹 float 類型的浮點(diǎn)數(shù)表示方法。
float類型
float 占用 32 位的存儲(chǔ)空間,32 位被分為了如下的三個(gè)部分:
符號(hào)位s:sign,符號(hào)位為 0 說明該浮點(diǎn)數(shù)為正數(shù),若為 1 則說明浮點(diǎn)數(shù)為負(fù)數(shù)
階碼E:exponent,代表該浮點(diǎn)數(shù)被二進(jìn)制科學(xué)表示法規(guī)范化后的指數(shù),階碼采用移碼表示
尾數(shù)M:mantissa,被二進(jìn)制規(guī)約化后要求小數(shù)點(diǎn)前一位數(shù)必須為 1,所以尾數(shù)中實(shí)際隱含了最高位 1,例如尾數(shù)為 M,則實(shí)際在還原時(shí),相當(dāng)于是 1.M
(1)關(guān)于尾數(shù)M
尾數(shù)是用來表示精度的,因?yàn)橐粋€(gè)數(shù)的表示其實(shí)是有多種方法的,例如:
314(D) = 3.14 × 10 ^ 2 = 31.4 × 10 ^ 1
1011(B) = 1.011 × 2 ^ 3 = 10.11 × 2 ^ 2 = 101.1 × 2 ^ 1
所以需要對(duì)小數(shù)部分的表示做出規(guī)定,為此標(biāo)準(zhǔn)規(guī)定小數(shù)部分需要簡化到「小數(shù)點(diǎn)左邊只有一位非0數(shù)」的形式。即規(guī)定:
314(D) 只能表示為 3.14 × 10 ^ 2 ,而不能表示為 31.4 × 10 ^ 1 或其他形式
1011(B) 只能表示為 1.011 × 2 ^ 3 ,而不能表示為 10.11 × 2 ^ 2,也不能表示為 101.1 × 2 ^ 1 或其他形式
因?yàn)?0進(jìn)制的非0數(shù)有1~9共9個(gè),所以小數(shù)點(diǎn)最左邊這位是不能省略掉的;但是2進(jìn)制數(shù)的非0數(shù)只有1這個(gè),所以小數(shù)點(diǎn)最左邊的非0位可以被省略,例如:
1011(B) = 1.011 × 2 ^ 3 ,小數(shù)部分雖然為1.011,但是可以省略為.011,即011
這樣就可以多表示一位信息。float的尾部部分(即小數(shù)部分)定義了23位,因?yàn)槭÷粤艘粋€(gè)最前面的 1 ,所以它是表示的其實(shí)是24位信息。
(2)關(guān)于階碼E
階碼是用來表示范圍的。float定義了8位數(shù)的階碼,所以它的表示范圍是0~256(2的256次方)。這種定義有個(gè)問題就是無法表示負(fù)指數(shù),將其定義為有符號(hào)數(shù)是個(gè)不錯(cuò)的解決辦法,但隨之而來的問題是–比較兩個(gè)階碼時(shí)不方便。
做兩個(gè)有符號(hào)數(shù)的某些運(yùn)算(例如加法)時(shí),首先需要比較二者的階碼大小,然后對(duì)其中一個(gè)數(shù)的階碼和尾數(shù)進(jìn)行調(diào)整。例如:
計(jì)算 (3.14 × 10 ^ 2) + (1.56 × 10 ^ 3)的值時(shí),首先需要比較二者的階碼大小,然后對(duì)其中一個(gè)數(shù)進(jìn)行調(diào)整,將(1.56 × 10 ^ 3)重新表示為(15.6 × 10 ^ 2),然后尾數(shù)部分相加 3.14 + 15.6 = 15.914,即結(jié)果為15.914 × 10 ^ 3,再調(diào)整階碼將其規(guī)范化,15.914 × 10 ^ 3 = 1.5914 × 10 ^ 4
可以看到,運(yùn)算其中一個(gè)重要的環(huán)節(jié)就是對(duì)兩個(gè)數(shù)的階碼大小進(jìn)行對(duì)比。如果2個(gè)階碼是一正一負(fù),那么對(duì)比二者的大小還需要考慮符號(hào)位,這樣就會(huì)增加額外邏輯。如果將階碼都加上同一個(gè)數(shù),使二者均為正數(shù),那么對(duì)比大小就方便很多了。
標(biāo)準(zhǔn)是這樣規(guī)定的:階碼的值需要加一個(gè)偏移量 127 (至于為什么移127不移128,我也不清楚,如果你知道可以告訴我)。例如:
1.011 × 2 ^ 3的原始階碼是3,按規(guī)定加上127后等于130,存儲(chǔ)到8位空間,即為 1000 0010
光說不練云玩家,接下來看看如何實(shí)現(xiàn)浮點(diǎn)數(shù)與10進(jìn)制數(shù)之間的轉(zhuǎn)換。
(1)將10進(jìn)制數(shù)轉(zhuǎn)換為float類型的浮點(diǎn)數(shù)
將 228 轉(zhuǎn)換為浮點(diǎn)數(shù)的流程如下:
是正數(shù),即符號(hào)位為0
把10進(jìn)制轉(zhuǎn)成2進(jìn)制:228(D)=11100100(B)
寫成規(guī)范化形式:11100100 = 1.11001 × 2 ^ 7
指數(shù)為7,階碼要加上偏移量127,即E = 7 + 127 = 134(D)= 1000 0110(B)
小數(shù)部分為1.11001,最前面的1是可以被隱含表示的,所以尾數(shù)M = 0.11001 = 11001,因?yàn)槲矓?shù)一共有23位,所以需要在低位補(bǔ)0直到滿足位寬要求,即 11001000000000000000000
最終結(jié)果為:0 10000110 11001000000000000000000
這里有一個(gè)浮點(diǎn)數(shù)轉(zhuǎn)換網(wǎng)站,可以查詢正確結(jié)果。
(2)將float類型的浮點(diǎn)數(shù)轉(zhuǎn)換為10進(jìn)制數(shù)
將 40490000 (16進(jìn)制)轉(zhuǎn)換為10進(jìn)制數(shù)的流程如下:
將其轉(zhuǎn)換為2進(jìn)制,40490000 = 0100 0000 0100 1001 0000 0000 0000 0000,然后分別獲取符號(hào)、階碼和尾數(shù)。
最高位的符號(hào)位為0,說明是一個(gè)正數(shù)
接下來的8位是階碼 10000000(即128),因?yàn)榧由狭似屏?27,所以指數(shù)的實(shí)際值是128 - 127 = 1。
剩余的23位是尾數(shù)10010010000000000000000,即0.1001001,再加上默認(rèn)的前導(dǎo)1,所以小數(shù)部分的值為1+0.1001001 = 1.1001001
該數(shù)的2進(jìn)制值為 1.1001001 × 2 ^ 1 = 11.001001,將其轉(zhuǎn)化成10進(jìn)制數(shù)11.001001(B)= 3. 140625。(這里的轉(zhuǎn)化有個(gè)簡便方法,11.001001可以看做是11001001除以2的6次方即64,而11001001也就是201,即201/64 = 3.140625 )
這是網(wǎng)站轉(zhuǎn)換的結(jié)果,和我們換算的結(jié)果一致。
double類型
double占用 64 位的存儲(chǔ)空間,64 位被分為了如下的三個(gè)部分:
這三部分的定義是和float類型一致的,只是位寬不同。需要注意的是,由于位寬的變化,所以double的階碼的偏移值不再是127,而是 1023。
除了這兩種較為常用的類型外,其實(shí)IEEE754還規(guī)定了幾種其他類型,但是都不太常用,所以不贅述了。
非規(guī)約化
當(dāng)階碼E不全為0,也不全為1時(shí),該浮點(diǎn)數(shù)稱為規(guī)約化(normal)形式。上面介紹的都是規(guī)約化形式的浮點(diǎn)數(shù)。當(dāng)階碼E全為0時(shí),該浮點(diǎn)數(shù)稱為非規(guī)約化(subnormal)形式。根據(jù)尾數(shù)的不同,可再分為2種形式:
尾數(shù)M為全 0 時(shí),表示 0 ,視符號(hào)位而定是+0還是-0(二者在某些場景有區(qū)別)
尾數(shù)M不全為 0 時(shí),表示非規(guī)約化小數(shù)
非規(guī)約化小數(shù)的定義和規(guī)約化小數(shù)之間存在如下區(qū)別:
規(guī)約化小數(shù)的尾數(shù)約定了含有一個(gè)隱藏的前導(dǎo)1,也就說真正表示的值是1.xxx;而非規(guī)約化小數(shù)的尾數(shù)則約定含有一個(gè)隱藏的前導(dǎo)0,即真正的值為0.xxx。
規(guī)約化小數(shù)的階碼需要加一個(gè)偏移量127,而非規(guī)約化小數(shù)的階碼需要加一個(gè)偏移量 126
非規(guī)約化小數(shù)可以用來表示那些非常小的接近0的數(shù)。
特殊值
除此之外,還規(guī)定了一些特殊值的表示方法:
如果階碼為全1,且尾數(shù)為全0時(shí),表示無窮。符號(hào)位為0則是正無窮,符號(hào)位為1則是負(fù)無窮。兩個(gè)很大的數(shù)相乘,或者除以零時(shí),無窮可以表示 溢出 的結(jié)果。
如果階碼為全1,且尾數(shù)不為全0時(shí),為NaN(not a number),表示這不是一個(gè)合法實(shí)數(shù)。一些運(yùn)算的結(jié)果不是合法值,就會(huì)返回NaN這樣的結(jié)果,例如對(duì)-1開平方(√-1)
對(duì)于以上情況(針對(duì)float類型),可以總結(jié)如下:
-
FPGA
+關(guān)注
關(guān)注
1643文章
21940瀏覽量
613290 -
浮點(diǎn)數(shù)
+關(guān)注
關(guān)注
0文章
61瀏覽量
16067 -
float
+關(guān)注
關(guān)注
0文章
9瀏覽量
7859
原文標(biāo)題:基于FPGA的數(shù)字信號(hào)處理——浮點(diǎn)數(shù)?
文章出處:【微信號(hào):Hack電子,微信公眾號(hào):Hack電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評(píng)論請先 登錄
32位浮點(diǎn)數(shù)字信號(hào)處理器SHARC產(chǎn)品組合(ADI)
基于SHARC 2147x處理器的浮點(diǎn)數(shù)字信號(hào)處理

TMS320C6654定點(diǎn)和浮點(diǎn)數(shù)字信號(hào)處理器詳細(xì)資料概述

如何在FPGA中正確處理浮點(diǎn)數(shù)運(yùn)算
TMS320C6701浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

SM320C6727B浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

SMJ320C6701浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

TMS320C6711D浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

TMS320C6671定點(diǎn)和浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

TMS320C6712D浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

TMS320C6713B浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

TMS320C6655/57定點(diǎn)和浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

TMS320C6743定點(diǎn)和浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

TMS320C6654定點(diǎn)和浮點(diǎn)數(shù)字信號(hào)處理器數(shù)據(jù)表

TMS320C6745浮點(diǎn)數(shù)字信號(hào)處理器技術(shù)簡介

評(píng)論