DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--浮點(diǎn)數(shù)的存儲格式
二:浮點(diǎn)數(shù)的存儲格式
2.1 IEEE floating point standard
上面我們說了,浮點(diǎn)數(shù)的小數(shù)點(diǎn)是不固定的,如果每個人都按照自己的愛好存儲在電腦里,那不就亂套了嗎?那么怎么在計算機(jī)中存儲這種類型的數(shù)字呢?象這類古老的問題前人早都為我們做好了相應(yīng)的規(guī)范,無規(guī)矩不成方圓嗎。我們平時所說的浮點(diǎn)數(shù)的存儲規(guī)范,就是由IEEE指定的,具體的規(guī)范文件是:IEEE Standard 754 for Binary Floating-Point Arithmetic。大家可以很容易的從網(wǎng)絡(luò)上下載到這篇文檔。
在c語言中,單精度(float)數(shù)據(jù)類型為32bits,具體的如下圖所示:
整個32bits分三部分,即
Sign:符號位,1 bit,0為正,1為負(fù);
Exponent(bias):指數(shù)部分,8 bits,存儲格式為移碼存儲(后面還會說明),偏移量為127;
Mantissa(fraction):尾數(shù)部分。
對應(yīng)的雙精度(double)類型的格式為:
同樣,64位也被分為了三部分,對照單精度,不用我說就可以理解各個部分的含義了吧?
是不是有點(diǎn)迷糊了,不要怕,理論這個東西最能忽悠人了,看起來很高深,其實(shí)也就是個屁大的事,舉個例子就很容易明白了。
舉例說明,如3.24x103,則對應(yīng)的部分為,Sign為0,3為指數(shù)部分(注意計算機(jī)里面存儲的不是3,這里僅僅為了說明),3.24為尾數(shù)。我們知道,計算機(jī)“笨”的要死,只認(rèn)識0和1,那么到底一個浮點(diǎn)數(shù)值在計算機(jī)存儲介質(zhì)中是如何存儲的呢?
例如,我們要想偷窺浮點(diǎn)類型的值4.25在計算機(jī)硬盤中存儲的廬山真面目,請跟我來:首先把4.25轉(zhuǎn)換成二進(jìn)制的表達(dá)方式,即100.01,在詳細(xì)點(diǎn),變成1.0001x22,好了,對號入座把。
Sign=0;
Exponent(bias)=2+127=129 (偏移量為127,就是直接加上個127了);
Mantissa=1.0001-1.0=0001(規(guī)格化后,小數(shù)點(diǎn)前總是整數(shù)1,全世界人都知道前面是1不是0,所以省略不寫了,即尾數(shù)部分不包括整數(shù)部分;當(dāng)別人問你,為什么23 bit的尾數(shù)部分可以表示24位的精度,知道怎么回答了吧。 靠,什么,沒有看懂,再仔細(xì)讀兩便就知道了)。
對照上面的圖示,相信你已經(jīng)看明白了吧?相信你的智商。為了加深認(rèn)識,再來一個。如果給定你一個二進(jìn)制數(shù)字串,01000000100010000000000000000000,并告訴你這是一個float類型的值,讓你說出它是老幾,知道怎么算了吧?如果不知道,看下面的圖,我就不廢話解釋了。
2.2深入理解浮點(diǎn)存儲格式
為了更深入的理解浮點(diǎn)數(shù)的格式。我們使用C語言來做一件事。在C語言的世界里,強(qiáng)制類型轉(zhuǎn)換,大家應(yīng)該都很熟悉了。例如:
float f=4.6;
int i;
…
i = (int)(f+0.5); // i=5
..
下面我們不使用強(qiáng)制類型轉(zhuǎn)化,我們自己來計算f轉(zhuǎn)換成整形應(yīng)該等于幾?
把主要代碼帖出來,如下:
int ival= ((*(int *)(&fval)) & 0x07fffff) | 0x800000;
// 提取指數(shù)部分
int exponent = 150 - (((*(int *)(&fval)) >> 23) & 0xff);
if (exponent < 0)
ival = (ival<< -exponent);
else
ival = (ival >> exponent);
// 如果小于0,則將結(jié)果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
好好琢磨琢磨吧,看明白了,就說明你基本明白了浮點(diǎn)數(shù)的存儲格式,如果沒有看明白,接著看,知道明白為止。
以上就是本文的全部內(nèi)容,希望能給大家一個參考,也希望大家多多支持我們。
欄 目:C語言
下一篇:C++11的for循環(huán),以及范圍Range類的簡單實(shí)現(xiàn)
本文標(biāo)題:DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--浮點(diǎn)數(shù)的存儲格式
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2215.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載