標籤:
1、整數的表示 大部分(所有?)機器 有符號數是補碼錶示。
2、整數的運算。+ -就是+-,按位加減,注意有符號和無符號的數值溢出,*/ 可以轉換成移位等 同樣是有位的截斷,可以先十進位計算換成2進位再截斷。
3、實際上是一種模運算,注意字長導致截斷。
4、浮點數的表示:
單精確度為例:32位,1位的符號位,8位指數位(無符號 書上說的實際值是他-127即範圍是-127-128,網上是錯的-128-127),23位的尾數,因為尾數小數點前是1,所以省略,計算時加1.
無窮和除 NaN 以外的其它浮點數一樣是有序的,從小到大依次為負無窮,負的有窮非零值,正負零(隨後介紹),正的有窮非零值以及正無窮。除 NaN 以外的任何非零值除以零,結果都將是無窮,而符號則由作為除數的零的符號決定。
回顧我們對 NaN 的介紹,當零除以零時得到的結果不是無窮而是 NaN 。原因不難理解,當除數和被除數都逼近於零時,其商可能為任何值,所以 IEEE 標準決定此時用 NaN 作為商比較合適。
5、特殊值:我們已經知道,指數域實際可以表達的指數值的範圍為 -127 到 128 之間(包含兩端)。其中,值 -127(儲存為 全 0)以及 +128(儲存為全 1)保留用作特殊值的處理。
6、非正常化數
我們來考察浮點數的一個特殊情況。選擇兩個絕對值極小的浮點數,以單精確度的二進位浮點數為例,比如 1.001 × 2-125 和 1.0001 × 2-125 這兩個數(分別對應於十進位的 2.6448623 × 10-38 和 2.4979255 × 10-38)。顯然,他們都是普通的浮點數(指數為 -125,大於允許的最小值 -126;尾數更沒問題),按照 IEEE 754 可以分別儲存為 00000001000100000000000000000000(0x1100000)和 00000001000010000000000000000000(0x1080000)。
現在我們看看這兩個浮點數的差值。不難得出,該差值為 0.0001 × 2-125,表達為規範浮點數則為 1.0 × 2-129。問題在於其指數大於允許的最小指數值,所以無法儲存為規範浮點數。最終,只能近似為零(Flush to Zero)。這中特殊情況意味著下面本來十分可靠的代碼也可能出現問題:
if (x != y) {
z = 1 / (x -y);
}
正如我們精心選擇的兩個浮點數展現的問題一樣,即使 x 不等於 y,x 和 y 的差值仍然可能絕對值過小,而近似為零,導致除以 0 的情況發生。
為瞭解決此類問題,IEEE 標準中引入了非規範(Denormalized)浮點數。規定當浮點數的指數為允許的最小指數值,即 emin 時,尾數不必是正常化的。比如上面例子中的差值可以表達為非規範的浮點數 0.001 × 2-126,其中指數 -126 等於 emin。注意,這裡規定的是"不必",這也就意味著"可以"。當浮點數實際的指數為 emin,且指數域也為 emin 時,該浮點數仍是規範的,也就是說,儲存時隱含著一個隱藏的尾數位。為了儲存非規範浮點數,IEEE 標準採用了類似處理特殊值零時所採用的辦法,即用特殊的指數域值 emin - 1 加以標記,當然,此時的尾數域不能為零。這樣,例子中的差值可以儲存為 00000000000100000000000000000000(0x100000),沒有隱含的尾數位。
7、有符號的零
因為 IEEE 標準的浮點數格式中,小數點左側的 1 是隱藏的,而零顯然需要尾數必須是零。所以,零也就無法直接用這種格式表達而只能特殊處理。
實際上,零儲存為尾數域為全為 0,指數域為 emin - 1 = -127,也就是說指數域也全為 0。考慮到符號域的作用,所以存在著兩個零,即 +0 和 -0。不同於正負無窮之間是有序的,IEEE 標準規定正負零是相等的。
零有正負之分,的確非常容易讓人困惑。這一點是基於數值分析的多種考慮,經利弊權衡後形成的結果。有符號的零可以避免運算中,特別是涉及無窮的運算中,符號資訊的丟失。舉例而言,如果零無符號,則等式 1/(1/x) = x 當x = ±∞ 時不再成立。原因是如果零無符號,1 和正負無窮的比值為同一個零,然後 1 與 0 的比值為正無窮,符號沒有了。解決這個問題,除非無窮也沒有符號。但是無窮的符號表達了上溢發生在數軸的哪一側,這個資訊顯然是不能不要的。零有符號也造成了其它問題,比如當 x=y 時,等式1/x = 1/y 在 x 和 y 分別為 +0 和 -0 時,兩端分別為正無窮和負無窮而不再成立。當然,解決這個問題的另一個思路是和無窮一樣,規定零也是有序的。但是,如果零是有序的,則即使 if (x==0) 這樣簡單的判斷也由於 x 可能是 ±0 而變得不確定了。兩害取其輕者,零還是無序的好。
8、NaN
NaN 用於處理計算中出現的錯誤情況,比如 0.0 除以 0.0 或者求負數的平方根。對於單精確度浮點數,NaN 表示為指數為 emax + 1 = 128(指數域全為 1),且尾數域不等於零的浮點數。IEEE 標準沒有要求具體的尾數域,所以 NaN 實際上不是一個,而是一族。
9、無窮
和 NaN 一樣,特殊值無窮(Infinity)的指數部分同樣為 emax + 1 = 128,不過無窮的尾數域必須為零。無窮用於表達計算中產生的上溢(Overflow)問題。比如兩個極大的數相乘時,儘管兩個運算元本身可以用儲存為浮點數,但其結果可能大到無法儲存為浮點數,而必須進行舍入。根據 IEEE 標準,此時不是將結果舍入為可以儲存的最大的浮點數(因為這個數可能離實際的結果相差太遠而毫無意義),而是將其舍入為無窮。對於負數結果也是如此,只不過此時舍入為負無窮,也就是說符號域為 1 的無窮。
10、尾數域為不全為 0 emin - 1 = -127,指數域全為 0,不存在,因為可以用非規範的表示。 我的理解。
11、浮點數的計算:這種運算通常伴隨著因為無法精確表示而進行的近似或舍入。
+-:兩浮點數進行加法和減法的運算規則是設 Ex小於等於Ey,則 x±y = (Mx*2^(Ex-Ey)±My)*2^Ey, 舍入處理
http://blog.csdn.net/b2b160/article/details/4492519
http://www.cnblogs.com/kingwolfofsky/archive/2011/07/21/2112299.html
http://baike.baidu.com/view/339796.htm
資訊表示和處理 from computer system chapter 2