matlab預設以64位雙精度浮點格式儲存資料於工作空間(workspace),第0位到第51位為小數部分,第52位到62位為指數部分,第63位為符號(正或負)部分。從排列組合的角度考慮,共有64個二進位制位,每個位有0和1兩種狀態,因此64位最多能夠表示的狀態數為2^64個,即最多能夠表示2^64個不同的數值。把這些數值按照從小到大的順序排列,相鄰的兩個數之間就會出現空隙。如果乙個需要儲存的數恰好落入空隙中,matlab怎麼處理這個數呢?下面以具體例項來說明。
64,127和128這三個數的二進位制表示分別為:1000000,1111111,10000000. 其在計算機中的儲存示意圖如下:
64的指數部分為6,係數部分為0000000……0,加上預設的1,成為1.0000000……0,根據二進位制數的科學計數法,小數點依據系數值向右偏移6個單位,復原出64 的二進位製碼1000000.0……0. 由於小數點需要向右偏移,這樣在儲存上最右邊一位的量級就是2^-46,這正是matlab函式eps給出的值,即計算機能儲存的比64大的第乙個值是64+2^-46. 並且,區間 [64, 128) 之間的所有數由於小數點偏移的都是6位,所以這些數的eps都是2^-46. 根據這樣的分析,雖然128只比127大1,但128的二進位製碼需要偏移7為,導致最後一位的量級為2^-45,所以eps(128)=2^-45. 可見乙個十進位制數的eps值是根據這個數的整數部分用二進位制科學計數法表示時的小數點偏移量來定的,且隨著偏移量的增大,eps也增大。
整數可以用二進位製碼精確表示,當1位符號部分和11位指數部分確定之後,係數的52位最多能夠編碼出2^52個數。圖中,當指數部分確定是6,就要用2^52個數表示區間 [64,128) 中的數。這樣,每個計算機能夠編碼的數都要覆蓋乙個小區間,計算機認為這個區間內的任何數都與這個數相等,才能用有限的數覆蓋乙個連續區間。在matlab中試驗發現,乙個數覆蓋的區間長度就是這個數的eps值,並且這個數處於這個區間的中心,但是區間端點是屬於本區間還是屬於緊挨的區間不一定,以[64, 128)上的小區間為例,區間是開區間與閉區間間隔連在一起的。
(64+0.5*eps(64), 64+1.5*eps(64))[64+1.5*eps(64), 64+2.5*eps(64)](64+2.5*eps(64),64+3.5*eps(65))[64+3.5*eps(64),64+4.5*eps(64)]……
還有一類特殊的整數,像64和128,剛好處於指數字變化的地方,試驗發現,64和128覆蓋的區間分別是 [64-0.5*eps(63), 64+0.5*eps(64)],
[128-0.5*eps(64), 128+0.5*eps(128)]. 即這類區間是閉區間,但是這個數不在這個區間的中心,數的左邊是上個eps值的一半,數的右邊是本eps值的一半,並且左邊的區間長度是右邊區間長度的一半。
根據上面的理論,可以對「大數吃掉小數」的問題提供乙個依據。當乙個數加或減的數小於這個數的eps值的一半時,計算機是忽略的。那麼乙個數是這個數的eps值的多少倍呢?64=2^6, eps(64)=2^-46; 64+(2^52-1)*eps(64)~128, eps(64+(2^52-1)*eps(64))=eps(64).所以,乙個數除以這個數的eps得到的值應該屬於區間 [2^52, 2^53).
單雙精度浮點數
浮點數並不一定等於小數 定點數也並不一定就是整數。所謂浮點數就是小數點在邏輯上是不固定的,而定點數只能表示小數點固定的數值,具用浮點數或定點數表示某哪一種數要看使用者賦予了這個數的意義是什麼。c 中的浮點數有6種,分別是 float 單精度,32位 unsigned float 單精度無符號,32位...
MATLAB 使用(三)控制雙精度浮點數的顯示格式
在預設情況下,matlab浮點計算產生的結果總是以64位元位儲存的雙精度浮點數。但是該雙精度數是否顯示和如何顯示,可以根據需要進行控制。是否顯示 控制符是 分號 phi10 10 1 sqrt 5 2 不顯示 phi10 10 1 sqrt 5 2 顯示如何顯示 format 恢復預設設定,等價於下...
浮點數精度問題
一 例子 首先我們去編譯器試試 double a 1.9 通過新增監視檢視a的值 會發現a的值是1.8999999 二 開始今天的學習 在最開始學c 的時候並沒有對浮點數進行很深入的學習,認為浮點不就是小數嘛,首先在c 的巨集裡面有 flt max 和 flt min 的定義,float是四位元組的...