程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 浮點數在盤算機中存儲方法是如何的

浮點數在盤算機中存儲方法是如何的

編輯:關於C++

浮點數在盤算機中存儲方法是如何的。本站提示廣大學習愛好者:(浮點數在盤算機中存儲方法是如何的)文章只能為提供參考,不一定能成為您想要的結果。以下是浮點數在盤算機中存儲方法是如何的正文


  C說話和C#說話中,關於浮點類型的數據采取單精度類型(float)和雙精度類型(double)來存儲,float數據占用32bit,double數據占用64bit,我們在聲明一個變量float f= 2.25f的時刻,是若何分派內存的呢?假如胡亂分派,那世界豈不是亂套了麼,其實豈論是float照樣double在存儲方法上都是服從IEEE的標准的,float服從的是IEEE R32.24 ,而double 服從的是R64.53。

  不管是單精度照樣雙精度在存儲中都分為三個部門:

  1.符號位(Sign) : 0代表正,1代表為負
  2.指數位(Exponent):用於存儲迷信計數法中的指數數據,而且采取移位存儲
  3.尾數部門(Mantissa):尾數部門

個中float的存儲方法以下圖所示:

而雙精度的存儲方法為:

  R32.24和R64.53的存儲方法都是用迷信計數法來存儲數據的,好比8.25用十進制的迷信計數法表現就為:8.25*,而120.5可以表現為:1.205*,這些小學的常識就不消多說了吧。而我們傻蛋盤算機基本不熟悉十進制的數據,他只熟悉0,1,所以在盤算機存儲中,起首要將下面的數更改成二進制的迷信計數法表現,8.25用二進制表現可表現為1000.01,我靠,不會連這都不會轉換吧?那我估量要沒轍了。120.5用二進制表現為:1110110.1用二進制的迷信計數法表現1000.01可以表現為1.0001*,1110110.1可以表現為1.1101101*,任何一個數都的迷信計數法表現都為1.xxx*,尾數部門便可以表現為xxxx,第一名都是1嘛,干嗎還要表現呀?可以將小數點後面的1省略,所以23bit的尾數部門,可以表現的精度卻釀成了24bit,事理就是在這裡,那24bit能准確到小數點後幾位呢,我們曉得9的二進制表現為1001,所以4bit能准確十進制中的1位小數點,24bit就可以使float能准確到小數點後6位,而關於指數部門,由於指數可正可負,8位的指數位能表現的指數規模就應當為:-127-128了,所以指數部門的存儲采取移位存儲,存儲的數據為元數據+127,上面就看看8.25和120.5在內存中真實的存儲方法。

  起首看下8.25,用二進制的迷信計數法表現為:1.0001*

依照下面的存儲方法,符號位為:0,表現為正,指數位為:3+127=130 ,位數部門為,故8.25的存儲方法以下圖所示:

而單精度浮點數120.5的存儲方法以下圖所示:

那末假如給出內存中一段數據,而且告知你是單精度存儲的話,你若何曉得該數據的十進制數值呢?其實就是對下面的反推進程,好比給出以下內存數據:0100001011101101000000000000,起首我們現將該數據分段,0 10000 0101 110 1101 0000 0000 0000 0000,在內存中的存儲就為下圖所示:

依據我們的盤算方法,可以盤算出,如許一組數據表現為:1.1101101*=120.5

而雙精度浮點數的存儲和單精度的存儲年夜同小異,分歧的是指數部門和尾數部門的位數。所以這裡不再具體的引見雙精度的存儲方法了,只將120.5的最初存儲方法圖給出,年夜家可以細心想一想為什麼是如許子的

上面我就這個基本常識點來處理一個我們的一個困惑,請看上面一段法式,留意不雅察輸入成果

float f = 2.2f;
double d = (double)f;
Console.WriteLine(d.ToString("0.0000000000000"));
f = 2.25f;
d = (double)f;
Console.WriteLine(d.ToString("0.0000000000000"));

  能夠輸入的成果讓年夜家困惑不解,單精度的2.2轉換為雙精度後,准確到小數點後13位後變成了2.2000000476837,而單精度的2.25轉換為雙精度後,變成了2.2500000000000,為什麼2.2在轉換後的數值更改了而2.25卻沒有更改呢?很奇異吧?其實經由過程下面關於兩種存儲成果的引見,我們曾經年夜概能找到謎底。起首我們看看2.25的單精度存儲方法,很簡略 0 1000 0001 001 0000 0000 0000 0000 0000,而2.25的雙精度表現為:0 100 0000 0001 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,如許2.25在停止強迫轉換的時刻,數值是不會變的,而我們再看看2.2呢,2.2用迷信計數法表現應當為:將十進制的小數轉換為二進制的小數的辦法為將小數*2,取整數部門,所以0.282=0.4,所以二進制小數第一名為0.4的整數部門0,0.4×2=0.8,第二位為0,0.8*2=1.6,第三位為1,0.6×2 = 1.2,第四位為1,0.2*2=0.4,第五位為0,如許永久也弗成能乘到=1.0,獲得的二進制是一個無窮輪回的分列 00110011001100110011... ,關於單精度數據來講,尾數只能表現24bit的精度,所以2.2的float存儲為:

  然則如許存儲方法,換算成十進制的值,卻不會是2.2的,應為十進制在轉換為二進制的時刻能夠會禁絕確,如2.2,而double類型的數據也存在異樣的成績,所以在浮點數表現中會發生些許的誤差,在單精度轉換為雙精度的時刻,也會存在誤差的成績,關於可以或許用二進制表現的十進制數據,如2.25,這個誤差就會不存在,所以會湧現下面比擬奇異的輸入成果。

以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved