DSP中浮點轉定點運算--浮點數的存儲格局。本站提示廣大學習愛好者:(DSP中浮點轉定點運算--浮點數的存儲格局)文章只能為提供參考,不一定能成為您想要的結果。以下是DSP中浮點轉定點運算--浮點數的存儲格局正文
二:浮點數的存儲格局
2.1 IEEE floating point standard
下面我們說了,浮點數的小數點是不固定的,假如每一個人都依照本身的喜好存儲在電腦裡,那不就亂套了嗎?那末怎樣在盤算機中存儲這類類型的數字呢?象這類陳舊的成績後人早都為我們做好了響應的標准,無規則不成方圓嗎。我們日常平凡所說的浮點數的存儲標准,就是由IEEE指定的,詳細的標准文件是:IEEE Standard 754 for Binary Floating-Point Arithmetic。年夜家可以很輕易的從收集高低載到這篇文檔。
在c說話中,單精度(float)數據類型為32bits,詳細的以下圖所示:
全部32bits分三部門,即
Sign:符號位,1 bit,0為正,1為負;
Exponent(bias):指數部門,8 bits,存儲格局為移碼存儲(前面還會解釋),偏移量為127;
Mantissa(fraction):尾數部門。
對應的雙精度(double)類型的格局為:
異樣,64位也被分為了三部門,對比單精度,不消我說便可以懂得各個部門的寄義了吧?
是否是有點含混了,不要怕,實際這個器械最能忽悠人了,看起來很精深,其實也就是個屁年夜的事,舉個例子就很輕易明確了。
舉例解釋,如3.24x103,則對應的部門為,Sign為0,3為指數部門(留意盤算機外面存儲的不是3,這裡僅僅為了解釋),3.24為尾數。我們曉得,盤算機“笨”的要逝世,只熟悉0和1,那末究竟一個浮點數值在盤算機存儲介質中是若何存儲的呢?
例如,我們要想竊視浮點類型的值4.25在盤算機硬盤中存儲的廬山真面貌,請跟我來:起首把4.25轉換成二進制的表達方法,即100.01,在具體點,釀成1.0001x22,好了,對號入坐把。
Sign=0;
Exponent(bias)=2+127=129 (偏移量為127,就是直接加上個127了);
Mantissa=1.0001-1.0=0001(規格化後,小數點前老是整數1,全球人都曉得後面是1不是0,所以省略不寫了,即尾數部門不包含整數部門;當他人問你,為何23 bit的尾數部門可以表現24位的精度,曉得怎樣答復了吧。 靠,甚麼,沒有看懂,再細心讀兩便就曉得了)。
對比下面的圖示,信任你曾經看明確了吧?信任你的智商。為了加深熟悉,再來一個。假如給定你一個二進制數字串,01000000100010000000000000000000,並告知你這是一個float類型的值,讓你說出它是老幾,曉得怎樣算了吧?假如不曉得,看上面的圖,我就不空話說明了。
2.2深刻懂得浮點存儲格局
為了更深刻的懂得浮點數的格局。我們應用C說話來做一件事。在C說話的世界裡,強迫類型轉換,年夜家應當都很熟習了。例如:
…
float f=4.6;
int i;
…
i = (int)(f+0.5); // i=5
..
上面我們不應用強迫類型轉化,我們本身來盤算f轉換成整形應當等於幾?
把重要代碼帖出來,以下:
//取23+1位的尾數部門
int ival= ((*(int *)(&fval)) & 0x07fffff) | 0x800000;
// 提取指數部門
int exponent = 150 - (((*(int *)(&fval)) >> 23) & 0xff);
if (exponent < 0)
ival = (ival<< -exponent);
else
ival = (ival >> exponent);
// 假如小於0,則將成果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
好好揣摩揣摩吧,看明確了,就解釋你根本明確了浮點數的存儲格局,假如沒有看明確,接著看,曉得明確為止。
以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。