浮點數即帶有小數的數,是不精確的。
在計算機內表示:f = (-1)^s * m * 2^e
s(符號數)
e(指數)
m(尾數)
表示公式
偏移量18
23(-1)s*2(p-127)*1.m
1271
1152
(-1)s*2(p-1023)*1.m
1023
例如:浮點數4.5計算機內表示為:
100.1=(-1)^0 * 1.001 * 2^2
s=0m=001(有效位不帶整數部分的1,只記錄小數部分)
e=2+127(偏移量)=129
最終表示:
0 10000001 00100000000000000000000
浮點數運算:
先介紹二進位制運算
對於有符號數而言:
(1)二進位制的最高位是符號位:0表示正數,1表示負數
(2)正數的原碼、反碼、補碼都一樣;
(3)負數的反碼 = 它的原碼符號位不變,其他位取反(0 ->1 ; 1->0 );
(4)負數的補碼 = 它的反碼 +1;
(5)0的反碼、補碼都是0;
(6)在計算機運算的時候,都是以補碼的方式來運算的;
具體例子可見:
其中補碼計算時要計算符號位,補碼運算結果的符號位為0,則得到的結果就是該正數,若結果的符號位為1,則對結果進行逆運算得到原碼,即減一取反。
浮點數計算規則(引用自)
設x=mx*2^ex,y= my*2^ey,求x±y=?
•規則:
–對階:de=ex-ey;小階向大階看齊。
–實現尾數的加(減)運算。
–規格化處理
•如果結果的兩個符號位的值不同,表示運算尾數結果溢位,應「右規」,即尾數結果右移一位,階碼+1
•如果最高數值位與符號位相同,應「左規」,此時尾數連續左移,直到最高數值位與符號位的值不同為止;同時從階碼中減去移位的位數
–捨入處理
–檢查是否溢位
例:•x=2^(010)·0.11011011, y=2^(100)·(-0.10101100)
•計算過程:
–①對階操作:階差△e=[ex]補+[-ey]補=00010+11100=11110
x階碼小,mx右移2位,保留階碼e=00100
[mx]補=00 00110110 11
–②尾數相加:[mx]補+[my]補=00 00110110 11+11 01010100
=11 10001010 11
–③規格化操作:左規,移一位,結果=11 00010101 10
階碼減1,e=00011
–④捨入:附加位最高位為1,在結果的最低位+1,
得新結果[m]補=11 00010110,m=-0.11101010
–⑤判溢位:階符為00,不溢位,最終結果為
x+y=2011·(-0.11101010)
例子:double x=0.04,y=0.03;
x-y=0.010000000002 不等於0.01
所以程式中不能對浮點數進行邏輯大小判斷。
設計金額的都要用bigdecimal。
計算機浮點數 float 表示
這篇文章講得比較淺顯易懂,所以轉一下。必須對計算機原理的原碼 反碼 補碼 移碼有個清晰的認識,另外參考一下ieee754,否則也會有不明白的地方。括號內為本人看法或觀點。我想浮點數的實現與編譯器也會有很大關係的。前兩天仔細看了看,覺得研究計算機如果不說說如何表示浮點數就太不厚道了.很多人也寫過,這裡...
計算機浮點數 float 表示
2007 09 09 17 07 3674人閱讀收藏 舉報 先說說32 位的 float型.乙個浮點數 x,在計算機中表示為 x a 2 e 這裡 e 代表指數,a 代表尾數,在 計算機內部,他們都是用二進位制表示的.其中a 用二進位制的科學表示法 表示,由於科學表示法第一位總是1 0除外 所以第一...
計算機的浮點數表示
假設有乙個浮點數 float fl 3.14159267 和圓周率很像啊 它在計算中的是怎樣儲存的呢?步驟1 轉換為二進位制表示,浮點數分為整數部分和小數部分,對於該浮點數來說,整數部分為3,浮點數部分為0.14159267.這裡假設fl是4個位元組,32位浮點數表示.十進位制 二進位制 3 000...