1樓:
這個問題比較難..其實在實際運算過程中或寫程式中我們要求的浮點數都有一定的精度,大多數情況下存成檔案等形式我們一般會讓他*10^n次方來儲存去掉小數位.下面說正題.
何資料在記憶體中都是以二進位制(0或1)順序儲存的,每一個1或0被稱為1位,而在x86cpu上一個位元組是8位。比如一個16位(2 位元組)的short int型變數的值是1000,那麼它的二進位制表達就是:00000011 11101000。
由於intel cpu的架構原因,它是按位元組倒序儲存的,那麼就因該是這樣:11101000 00000011,這就是定點數1000在記憶體中的結構。
目前c/c++編譯器標準都遵照ieee制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:
````````符號位 階碼 尾數 長度
float 1 8 23 32
double 1 11 52 64
臨時數 1 15 64 80
由於通常c編譯器預設浮點數是double型的,下面以double為例:
共計64位,摺合8位元組。由最高到最低位分別是第63、62、61、……、0位:
最高位63位是符號位,1表示該數為負,0正;
62-52位,一共11位是指數位;
51-0位,一共52位是尾數位。
按照ieee浮點數表示法,下面將把double型浮點數38414.4轉換為十六進位制**。
把整數部和小數部分開處理:整數部直接化十六進位制:960e。小數的處理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
實際上這永遠算不完!這就是著名的浮點數精度問題。所以直到加上前面的整數部分算夠53位就行了(隱藏位技術:最高位的1 不寫入記憶體)。
如果你夠耐心,手工算到53位那麼因該是:38414.4(10)=1001011000001110.0110101010101010101010101010101010101(2)
科學記數法為:1.001……乘以2的15次方。指數為15!
於是來看階碼,一共11位,可以表示範圍是-1024 ~ 1023。因為指數可以為負,為了便於計算,規定都先加上1023,在這裡, 15+1023=1038。二進位制表示為:
100 00001110
符號位:正—— 0 ! 合在一起(尾數二進位制最高位的1不要):
01000000 11100010 11000001 11001101 01010101 01010101 01010101 01010101
按位元組倒序儲存的十六進位制數就是:
55 55 55 55 cd c1 e2 40
2樓:
浮點數不難,但是要想記熟還真有點不容易,多琢磨琢磨。
一般情況下,浮點數的表示有一下幾個要點:
1、要規格化(讓浮點數表示結果唯一),因為100=10^2 = 0.1 * 10^3, 所以第一步要統一地規格化,確定「階數」和「尾數」(尾數在0.5-1之間,也就是二進位制的0.
1-1.0之間)
2、「階碼」一般用「移碼」表示法,而「尾數」一般用「原碼/補碼錶示法,「數符」表示浮點數的正副號
3、浮點數的形式: 「符號位」+「階碼」+「尾數「
--浮點數的表示按照不同地標準,表示方法不同,你的原問題沒講清楚用什麼格式表示,我就用最常用地格式來理解了
------------------
其實就以上兩點,計算機中「『帯符號數』的表示」有四種:原碼、補碼、反碼、移碼,這些都是基礎知識,可以自己去看一下這四種表示方法,就自然明白「階符、數符」這些相當於「符號位」的作用了。
先簡單講一下吧,你再結合詳細資料看吧:
(小數點前面可以看成是「符號位」,也就對應原來地「階符」和「數符」)
原碼:0.11表示0.
75(2^-1 + 2 ^-2), 1.11表示 『-0.75』(前面的1相當於符號位,表示這個數是負數,也就是說「符號位是0」表示正數,1表示負數)
補碼:最普遍地就是補碼了 0.11表示0.75, 1.11表示『-0.25』(也是「0」為正數,1為負數。和原碼地規律一樣)
反碼,最簡單了:正數不變,負數對每一位『取反』即可,0.11=0.75,1.10=-0.25(即0.01地相反數)
-------------以上三種表示方法,對正數的情況都不做處理,但是移碼錶示法要對正數做處理。
移碼:1.01=0.25,而0.01=-0.75
。移碼複雜一點,他的表示方法是: 移碼= 2^階碼位數 + 真值(真值:指原來那個『帯符號數』,注意要把把正副號帶入計算)
-----------------------------------
n=-0.110101x2^100: 階數是「正100」,尾數是「負0.110101」,所以整個浮點數是個負數,所以第一位是「1」
階碼是「10 0100」
所以,應該表示為: 1(符號位) 100100(階碼的移碼錶示) 11010100
3樓:
包括四個部分,尾數的符號位,尾數,階碼的符號位,階碼
-0.11首先儲存階碼的符號位-,然後是階碼1,接下去是尾數的符號位-,然後是尾數1.1
4樓:匿名使用者
這個問題「計算機組成原理」一書上有,建議提問者自己讀書去解決嗯....
浮點數 在計算機內的儲存形式
5樓:帥哥聯盟
浮點數不難,但是要想記熟還真有點不容易,多琢磨琢磨。
一般情況下,浮點數的表示有一下幾個要點:
1、要規格化(讓浮點數表示結果唯一),因為100=10^2 = 0.1 * 10^3, 所以第一步要統一地規格化,確定「階數」和「尾數」(尾數在0.5-1之間,也就是二進位制的0.
1-1.0之間)
2、「階碼」一般用「移碼」表示法,而「尾數」一般用「原碼/補碼錶示法,「數符」表示浮點數的正副號
3、浮點數的形式: 「符號位」【應該就是『數符』】+「階碼」+「尾數「
--浮點數的表示按照不同地標準,表示方法不同,你的原問題沒講清楚用什麼格式表示,我就用最常用地格式來理解了
------------------
其實就以上兩點,計算機中「『帯符號數』的表示」有四種:原碼、補碼、反碼、移碼,這些都是基礎知識,可以自己去看一下這四種表示方法,就自然明白「階符、數符」這些相當於「符號位」的作用了。
先簡單講一下吧,你再結合詳細資料看吧:【設所表示的都是定點純小數】
(小數點前面可以看成是「符號位」,也就對應原來地「階符」和「數符」)
原碼:0.11表示0.
75(2^-1 + 2 ^-2), 1.11表示 『-0.75』(前面的1相當於符號位,表示這個數是負數,也就是說「符號位是0」表示正數,1表示負數)
補碼:最普遍地就是補碼了 0.11表示0.75, 1.11表示『-0.25』(也是「0」為正數,1為負數。和原碼地規律一樣)
反碼,最簡單了:正數不變,負數對每一位『取反』即可,0.11=0.75,1.10=-0.25(即0.01地相反數)
-------------以上三種表示方法,對正數的情況都不做處理,但是移碼錶示法要對正數做處理。
移碼:1.01=0.25,而0.01=-0.75
。移碼複雜一點,他的表示方法是: 移碼= 2^階碼位數 + 真值(真值:指原來那個『帯符號數』,注意要把把正副號帶入計算)
-----------------------------------
n=-0.110101x2^100: 階數是「正100」,尾數是「負0.110101」,所以整個浮點數是個負數,所以第一位是「1」【第一個符號位-「數符」表示『尾數的正負號』】
階碼是「10 0100」【移碼錶示法,最高位是「符號位」】
所以,應該表示為: 1(符號位) 100100(階碼的移碼錶示) 11010100【尾數和符號位結合起來,用的是原碼錶示法】
請問浮點型資料在計算機是怎麼儲存的
6樓:月似當時
對於浮點型別的資料採用單精度型別(float)和雙精度型別(double)來儲存,float資料佔用32bit,double資料佔用64bit。
無論是單精度還是雙精度在儲存中都分為三個部分:
1、符號位(sign) : 0代表正,1代表為負。
2、指數位(exponent):用於儲存科學計數法中的指數資料,並且採用移位儲存。
3、尾數部分(mantissa):尾數部分。
擴充套件資料
實型變數分為兩類:單精度型和雙精度型,
其型別說明符為float 單精度說明符,double
雙精度說明符。在turbo
c中單精度型佔4個位元組(32位)記憶體空間,其數值範圍為3.4e-38~3.4e+38,只能提供七位有效數字。
雙精度型佔8
個位元組(64位)記憶體空間,其數值範圍為1.7e-308~1.7e+308,可提供16位有效數字。
實型變數說明的格式和書寫規則與整型相同。
例如: float x,y; (x,y為單精度實型量)
double a,b,c; (a,b,c為雙精度實型量)
實型常數不分單、雙精度,都按雙精度double型處理。
一個浮點數在機器內部的儲存方式 10
7樓:匿名使用者
在科學計算中,為了能表示特大或特小的數,採用"浮點數"或稱"科學表示法"表示實數,"浮點數"由兩部分組成,即尾數和階碼。例如, ,則0.23456為尾數,5是階碼。
在浮點表示方法中,小數點的位置是浮動的,階碼可取不同的數值。為了便於計算機中小數點的表示,規定將浮點數寫成規格化的形式,即尾數的絕對值大於等於0.1並且小於1,從而唯一規定了小數點的位置。
尾數的長度將影響數的精度,其符號將決定數的符號。浮點數的階碼相當於數學中的指數,其大小將決定數的表示範圍。
同樣,任意二進位制規格化浮點數的表示形式為:
其中 是尾數,前面的" "表示數符; 是階碼,前面的" "表示階符。它在計算機內的儲存形式如圖2.1.2所示。
階符 階碼 數符 尾數
圖2.1.2 浮點數的儲存格式
例如,設尾數為8位,階碼為6位;則二進位制數 ,浮點數的存放形式見圖2.1.3。
圖2.1.3 的存放
浮點變數賦值中浮點數加字尾f和不加字尾f的編譯提示為什麼不一
c語言預設 bai3.1是一個double型的數,float s 3.1 這句相 du當於把一zhi個double型的雙精度dao浮點數賦給回了單精度浮點數s,所以有 答可能產生截斷。加上f後3.1f是一個float型數,把它賦給同是float型的s就沒問題啦。3.1預設的是 制double型,若是...
浮點數的精度和範圍區別是什麼
浮點數抄一般包括單襲 精度浮點數 float 和雙精度浮點數 double 單精度浮點數精度 最多有7位十進位制有效數字。單精度浮點數範圍 3.4 10 38 3.4 10 38。雙精度浮點數精度 可以表示十進位制的15或16位有效數字雙精度浮點數範圍 1.7x10 308 1.7x10 308。區...
為什麼浮點數的表示範圍比整型數大
浮點數的表示範圍比整型數大是因為採用的表示形式不同。整型數在計算機底層採用補碼的形式表示,除去首位的符號位,剩餘的位數即表示數值的範圍。浮點數在計算機中則是實數由一個整數或定點數 即尾數 乘以某個基數 計算機中通常是2 的整數次冪得到,用以近似表示任意某個實數。1 浮點數和整型數在計算機內的表示方式...