a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

DSP中浮點轉定點運算--浮點數(shù)的存儲格式

2020-01-26 14:32:55
字體:
來源:轉載
供稿:網友

二:浮點數(shù)的存儲格式

2.1 IEEE floating point standard

  上面我們說了,浮點數(shù)的小數(shù)點是不固定的,如果每個人都按照自己的愛好存儲在電腦里,那不就亂套了嗎?那么怎么在計算機中存儲這種類型的數(shù)字呢?象這類古老的問題前人早都為我們做好了相應的規(guī)范,無規(guī)矩不成方圓嗎。我們平時所說的浮點數(shù)的存儲規(guī)范,就是由IEEE指定的,具體的規(guī)范文件是:IEEE Standard 754 for Binary Floating-Point Arithmetic。大家可以很容易的從網絡上下載到這篇文檔。

  在c語言中,單精度(float)數(shù)據(jù)類型為32bits,具體的如下圖所示:

http://files.VeVB.COm/file_images/article/201606/2016617102352889.png

整個32bits分三部分,即

  Sign:符號位,1 bit,0為正,1為負;

  Exponent(bias):指數(shù)部分,8 bits,存儲格式為移碼存儲(后面還會說明),偏移量為127;

  Mantissa(fraction):尾數(shù)部分。

  對應的雙精度(double)類型的格式為:

http://files.VeVB.COm/file_images/article/201606/2016617102402031.png

同樣,64位也被分為了三部分,對照單精度,不用我說就可以理解各個部分的含義了吧?

  是不是有點迷糊了,不要怕,理論這個東西最能忽悠人了,看起來很高深,其實也就是個屁大的事,舉個例子就很容易明白了。

舉例說明,如3.24x103,則對應的部分為,Sign為0,3為指數(shù)部分(注意計算機里面存儲的不是3,這里僅僅為了說明),3.24為尾數(shù)。我們知道,計算機“笨”的要死,只認識0和1,那么到底一個浮點數(shù)值在計算機存儲介質中是如何存儲的呢?

例如,我們要想偷窺浮點類型的值4.25在計算機硬盤中存儲的廬山真面目,請跟我來:首先把4.25轉換成二進制的表達方式,即100.01,在詳細點,變成1.0001x22,好了,對號入座把。

Sign=0;

Exponent(bias)=2+127=129 (偏移量為127,就是直接加上個127了);

Mantissa=1.0001-1.0=0001(規(guī)格化后,小數(shù)點前總是整數(shù)1,全世界人都知道前面是1不是0,所以省略不寫了,即尾數(shù)部分不包括整數(shù)部分;當別人問你,為什么23 bit的尾數(shù)部分可以表示24位的精度,知道怎么回答了吧。 靠,什么,沒有看懂,再仔細讀兩便就知道了)。

 http://files.VeVB.COm/file_images/article/201606/2016617102409132.png

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

http://files.VeVB.COm/file_images/article/201606/2016617102421605.png

2.2深入理解浮點存儲格式

為了更深入的理解浮點數(shù)的格式。我們使用C語言來做一件事。在C語言的世界里,強制類型轉換,大家應該都很熟悉了。例如:

復制代碼 代碼如下:

float f=4.6;

int i;

i = (int)(f+0.5); // i=5

..

下面我們不使用強制類型轉化,我們自己來計算f轉換成整形應該等于幾?

把主要代碼帖出來,如下:

復制代碼 代碼如下:
//取23+1位的尾數(shù)部分

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,則將結果取反

if ((*(int *)&fval) & 0x80000000)

ival = -ival;

好好琢磨琢磨吧,看明白了,就說明你基本明白了浮點數(shù)的存儲格式,如果沒有看明白,接著看,知道明白為止。

以上就是本文的全部內容,希望能給大家一個參考,也希望大家多多支持武林網。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 亚洲欧美中文日韩在线v日本 | 久久亚洲精品国产一区最新章节 | 免费不卡视频 | 久久精品国产亚洲一区二区三区 | 亚洲婷婷网 | 三级网站视频 | 天天干人人 | 久久久久亚洲精品国产 | 最新av中文字幕 | 99久久久久久久久 | 亚洲视频在线一区二区 | 免费av播放 | 国产精品久久久久久久久久99 | 特黄级国产片 | 欧美黄视频在线观看 | 国产九九精品 | 欧美影院一区 | 日本不卡免费新一二三区 | 日韩视频精品在线 | 亚洲国产精品一区 | 伊人网站| 国产中文字幕一区二区三区 | 日韩在线一区二区三区 | 黄色精品视频 | 亚洲欧美日韩电影 | 日韩精品在线一区 | 二区在线视频 | 成人免费视频视频在线观看 免费 | 中文不卡在线 | 久久久精彩视频 | aa级毛片毛片免费观看久 | 国产美女永久免费无遮挡 | 91视频专区 | 久久在线视频 | 亚洲午夜视频在线观看 | 精品国产乱码久久久久久1区2区 | 中文字幕色婷婷在线视频 | 欧美怡红院视频一区二区三区 | 97在线视频免费 | 日本三级网站在线观看 | 国产高清第一页 |