DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--浮點(diǎn)數(shù)的存儲(chǔ)格式
二:浮點(diǎn)數(shù)的存儲(chǔ)格式
2.1 IEEE floating point standard
上面我們說(shuō)了,浮點(diǎn)數(shù)的小數(shù)點(diǎn)是不固定的,如果每個(gè)人都按照自己的愛(ài)好存儲(chǔ)在電腦里,那不就亂套了嗎?那么怎么在計(jì)算機(jī)中存儲(chǔ)這種類(lèi)型的數(shù)字呢?象這類(lèi)古老的問(wèn)題前人早都為我們做好了相應(yīng)的規(guī)范,無(wú)規(guī)矩不成方圓嗎。我們平時(shí)所說(shuō)的浮點(diǎn)數(shù)的存儲(chǔ)規(guī)范,就是由IEEE指定的,具體的規(guī)范文件是:IEEE Standard 754 for Binary Floating-Point Arithmetic。大家可以很容易的從網(wǎng)絡(luò)上下載到這篇文檔。
在c語(yǔ)言中,單精度(float)數(shù)據(jù)類(lèi)型為32bits,具體的如下圖所示:

整個(gè)32bits分三部分,即
Sign:符號(hào)位,1 bit,0為正,1為負(fù);
Exponent(bias):指數(shù)部分,8 bits,存儲(chǔ)格式為移碼存儲(chǔ)(后面還會(huì)說(shuō)明),偏移量為127;
Mantissa(fraction):尾數(shù)部分。
對(duì)應(yīng)的雙精度(double)類(lèi)型的格式為:

同樣,64位也被分為了三部分,對(duì)照單精度,不用我說(shuō)就可以理解各個(gè)部分的含義了吧?
是不是有點(diǎn)迷糊了,不要怕,理論這個(gè)東西最能忽悠人了,看起來(lái)很高深,其實(shí)也就是個(gè)屁大的事,舉個(gè)例子就很容易明白了。
舉例說(shuō)明,如3.24x103,則對(duì)應(yīng)的部分為,Sign為0,3為指數(shù)部分(注意計(jì)算機(jī)里面存儲(chǔ)的不是3,這里僅僅為了說(shuō)明),3.24為尾數(shù)。我們知道,計(jì)算機(jī)“笨”的要死,只認(rèn)識(shí)0和1,那么到底一個(gè)浮點(diǎn)數(shù)值在計(jì)算機(jī)存儲(chǔ)介質(zhì)中是如何存儲(chǔ)的呢?
例如,我們要想偷窺浮點(diǎn)類(lèi)型的值4.25在計(jì)算機(jī)硬盤(pán)中存儲(chǔ)的廬山真面目,請(qǐng)跟我來(lái):首先把4.25轉(zhuǎn)換成二進(jìn)制的表達(dá)方式,即100.01,在詳細(xì)點(diǎn),變成1.0001x22,好了,對(duì)號(hào)入座把。
Sign=0;
Exponent(bias)=2+127=129 (偏移量為127,就是直接加上個(gè)127了);
Mantissa=1.0001-1.0=0001(規(guī)格化后,小數(shù)點(diǎn)前總是整數(shù)1,全世界人都知道前面是1不是0,所以省略不寫(xiě)了,即尾數(shù)部分不包括整數(shù)部分;當(dāng)別人問(wèn)你,為什么23 bit的尾數(shù)部分可以表示24位的精度,知道怎么回答了吧。 靠,什么,沒(méi)有看懂,再仔細(xì)讀兩便就知道了)。

對(duì)照上面的圖示,相信你已經(jīng)看明白了吧?相信你的智商。為了加深認(rèn)識(shí),再來(lái)一個(gè)。如果給定你一個(gè)二進(jìn)制數(shù)字串,01000000100010000000000000000000,并告訴你這是一個(gè)float類(lèi)型的值,讓你說(shuō)出它是老幾,知道怎么算了吧?如果不知道,看下面的圖,我就不廢話解釋了。

2.2深入理解浮點(diǎn)存儲(chǔ)格式
為了更深入的理解浮點(diǎn)數(shù)的格式。我們使用C語(yǔ)言來(lái)做一件事。在C語(yǔ)言的世界里,強(qiáng)制類(lèi)型轉(zhuǎn)換,大家應(yīng)該都很熟悉了。例如:
float f=4.6;
int i;
…
i = (int)(f+0.5); // i=5
..
下面我們不使用強(qiáng)制類(lèi)型轉(zhuǎn)化,我們自己來(lái)計(jì)算f轉(zhuǎn)換成整形應(yīng)該等于幾?
把主要代碼帖出來(lái),如下:
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;
好好琢磨琢磨吧,看明白了,就說(shuō)明你基本明白了浮點(diǎn)數(shù)的存儲(chǔ)格式,如果沒(méi)有看明白,接著看,知道明白為止。
以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
- 浮點(diǎn)數(shù)在計(jì)算機(jī)中存儲(chǔ)方式是怎樣的
- DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--浮點(diǎn)與定點(diǎn)概述
- DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--定點(diǎn)數(shù)的加減乘除運(yùn)算
- DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--定點(diǎn)數(shù)模擬浮點(diǎn)數(shù)運(yùn)算及常見(jiàn)的策略
- DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--舉例及編程中的心得
相關(guān)文章
淺析C++中strlen函數(shù)的使用與模擬實(shí)現(xiàn)strlen的方法
這篇文章主要介紹了strlen函數(shù)的使用與模擬實(shí)現(xiàn)strlen的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼
HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無(wú)狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請(qǐng)求,需要的朋友可以參考下2023-11-11
C++實(shí)現(xiàn)類(lèi)似延時(shí)停頓的打字效果
這篇文章主要介紹的是使用C++實(shí)現(xiàn)類(lèi)似延時(shí)停頓的打字效果的代碼,非常的簡(jiǎn)單,推薦給大家,有需要的小伙伴可以參考下。2015-03-03
C++利用鏈表實(shí)現(xiàn)圖書(shū)信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++利用鏈表實(shí)現(xiàn)圖書(shū)信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
詳解C語(yǔ)言如何實(shí)現(xiàn)配置文件的讀寫(xiě)
這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言實(shí)現(xiàn)配置文件的讀寫(xiě),包括定義全局宏、公用函數(shù)、比較字符串等功能,需要的可以參考一下2024-11-11
C語(yǔ)言實(shí)現(xiàn)電腦關(guān)機(jī)程序
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02

