小數點位置約定位可浮動的數稱為浮點數,f浮點數的表示:
單精度,x=(-1)s×(1.m)×2e-127
雙精度,x=(-1)s×(1.m)×2e-1023
為了在浮點數運算過程中盡可能地多保留有效數字的位數,使有效數字盡量佔滿尾數數字,必須在運算過程中對浮點數進行「規格化」操作。
規格化操作有兩種:
左規和右規。當有效數字進到小數點前面時,需要進行右規,右規時,尾數每右移一位,階碼加1.直到尾數變成規格化形式,右規時指數會增加,因此有可能溢位;左規時,尾數每左移一位,階碼減1,直到位數變成規格化為止。
32位單精度和64位雙精度格式,對於ieee754標準,基數隱含為2。尾數用原碼表示,第一位總為1,所以可以省略第一位,使得單精度的23位實際表示了24位,雙精度的52位,實際表示了53位。
ieee754規定隱藏位1的位置在小數點之前。在ieee754標準中,階碼用移碼表示,但偏置常數並不是通常n位移碼所用的2 n − 1 2^2n−1,而是2 n − 1 − 1 2^-12n−1−1,故而單精度的偏置常數為127,雙精度的偏執常數為1023.由於隱藏了小數點前1的原因,如果換成等值純小數表示的話,階碼就需要加1.但是無論是哪一種,最終的計算結果和偏置常數的情況是相同的。
全0階碼全0尾數:+0/-0
ieee754的0有兩種表示:+0和-0。0的符號取決於數的符號位s。一般情況下是等效的。
全0階碼非0尾數:非規格化數
非規格化數的特點就是階碼部分全為0,尾數的高位有乙個或者連續幾個0,但不全為0。因為隱藏位為0,並且單精度和雙精度浮點數的階碼的值分別為-126或者-1022,故數值可以為(-1)s×(0.f)×2-126或者(-1)s×(0.f)×2-1022,非規格化數可用於處理階碼下溢,使得出現比最小規格化數還小的數時程式也能繼續進行下去。簡而言之就是尾數向右移動,階碼加1.
全1階碼全0尾數:+∞/-∞
引入無窮大和無窮小使得在計算過程出現異常的情況下計算可以繼續下去,並且可以提供錯誤檢測的功能。+∞在數值上大於所有有限數,-∞則小於所有有限數,無窮大數既可作為運算元,也可能是運算的結果。當運算元為無窮大時,系統可以有兩種處理方式。
產生不發訊號的非數nan,如+∞+(-∞),+∞-(+∞),∞/∞等
產生明確的結果,如5+(+∞)=+∞,(+∞)+(+∞)=+∞,5-(+∞)=-∞,(-∞)-(+∞)=-∞等
全1階碼非0尾數:nan(not a number)
表示沒有定義的數,稱為非數。分為不發訊號和發訊號兩種。可以用非數表示每個變數的非初始化值
階碼非全0非全1:規格化非0數因為特殊值的存在,除去全0全1解碼後,單精度階碼個數為254,最大階數為127。
浮點數 儲存
關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...
浮點數操作
float fx 49.03f int nx fx 100 printf d nx 執行上述 結果 4902。用vc6.0,2005,gcc編譯執行結果都是一樣。為什麼會這樣呢,是因為浮點數運算具有不精確性。其實編譯上面的 編譯器會有警告的。warning c4244 initializing co...
浮點數比較
在數 算當中經常會涉及到判斷兩個數是否相等的情況 對於整數很好處理 a b這樣的乙個語句就可以解決全部的問題 但是對於浮點數是不同的 首先,浮點數在計算機當中的二進位制表達方式就決定了大多數浮點數都是無法精確的表達的 現在的計算機大部分都是數字計算機,不是模擬機,數字機的離散化的資料表示方法自然無法...