Can you summarize the following document?
        
  一個浮點數 (Value) 的表示其實可以這樣表示:  formula_1  也就是浮點數的實際值,等於符號位(sign bit)乘以指數偏移值(exponent bias)再乘以分數值(fraction)。  以下內文是IEEE 754對浮點數格式的描述。

  把W個位元(bit)的資料,從記憶體地址低端到高階,以0到W−1編碼。通常將記憶體地址低端的位元寫在最右邊,稱作最低有效位(Least Significant Bit, LSB),代表最小的位元,改變時對整體數值影響最小的位元。宣告這一點的必要性在於X86體系架構是小端序的資料儲存。  對於十進位制整數N,必要時表示為N以與二進位制的數的表示N相區分。  對於一個數,其二進位制科學計數法表示下的指數的值,下文稱之為指數的實際值;而根據IEEE 754標準對指數部分的編碼的值,稱之為浮點數表示法指數域的編碼值。

  二進位制浮點數是以符號數值表示法的格式儲存——最高有效位被指定為符號位(sign bit);「指數部分」,即次高有效的e個位元,儲存指數部分;最後剩下的f個低有效位的位元,儲存「有效數」(significand)的小數部分(在非規約形式下整數部分預設為0,其他情況下一律預設為1)。

  指數偏移值(exponent bias),即浮點數表示法中指數域的編碼值,等於指數的實際值加上某個固定的值,IEEE 754標準規定該固定值為formula_2,其中的formula_3為儲存指數的位元的長度。  以單精度浮點數為例,它的指數域是8個位元,固定偏移值是formula_4。此為有號數的表示方式,單精度浮點數的指數部分實際取值是從-126到127(-127和128被用作特殊值處理,見下方「非規約形式的浮點數」和「特殊值」)。例如指數實際值為formula_5,在單精度浮點數中的指數域編碼值為formula_6,即formula_7。  採用指數的實際值加上固定的偏移值的辦法表示浮點數的指數,好處是可以用長度為formula_3個位元的無符號整數來表示所有的指數取值,這使得兩個浮點數的指數大小的比較更為容易,實際上可以按照字典次序比較兩個浮點表示的大小。  這種移碼錶示的指數部分,中文稱作階碼。

  如果浮點數中指數部分的編碼值在formula_9之間,且在科學表示法的表示方式下,分數 (fraction) 部分最高有效位(即整數碼)是formula_10,那麼這個浮點數將被稱為規約形式的浮點數。“規約”是指用唯一確定的浮點形式去表示一個值。  由於這種表示下的尾數有一位隱含的二進位制有效數字,為了與二進位制科學計數法的尾數(mantissa)相區別,IEEE754稱之為有效數(significant)。  舉例來說,雙精度 (64-bit) 的規約形式浮點數在指數偏移值的值域為formula_11 (11-bit) 到formula_12,在分數部分則是formula_13到formula_14 (52-bit)

  如果浮點數的指數部分的編碼值是0,分數部分非零,那麼這個浮點數將被稱為非規約形式的浮點數。一般是某個數字相當接近零時才會使用非規約型式來表示。 IEEE 754標準規定:非規約形式的浮點數的指數偏移值比規約形式的浮點數的指數偏移值小1。例如,最小的規約形式的單精度浮點數的指數部分編碼值為1,指數的實際值為-126;而非規約的單精度浮點數的指數域編碼值為0,對應的指數實際值也是-126而不是-127。實際上非規約形式的浮點數仍然是有效可以使用的,只是它們的絕對值已經小於所有的規約浮點數的絕對值;即所有的非規約浮點數比規約浮點數更接近0。規約浮點數的尾數大於等於1且小於2,而非規約浮點數的尾數小於1且大於0。  除了規約浮點數,IEEE754-1985標準採用非規約浮點數,用來解決填補絕對值意義下最小規格數與零的距離。(舉例說,正數下,最大的非規格數等於最小的規格數。而一個浮點數編碼中,如果exponent=0,且尾數部分不為零,那麼就按照非規約浮點數來解析)非規約浮點數源於70年代末IEEE浮點數標準化專業技術委員會醞釀浮點數二進位制標準時,Intel公司對漸進式下溢位(gradual underflow)的力薦。當時十分流行的DEC VAX機的浮點數表示採用了突然式下溢位(abrupt underflow)。如果沒有漸進式下溢位,那麼0與絕對值最小的浮點數之間的距離(gap)將大於相鄰的小浮點數之間的距離。例如單精度浮點數的絕對值最小的規約浮點數是formula_15,它與絕對值次小的規約浮點數之間的距離為formula_16。如果不採用漸進式下溢位,那麼絕對值最小的規約浮點數與0的距離是相鄰的小浮點數之間距離的formula_17倍,可以說是非常突然的下溢位到0。這種情況的一種糟糕後果是:兩個不等的小浮點數X與Y相減,結果將是。訓練有素的數值分析人員可能會適應這種限制情況,但對於普通的程式設計師就很容易陷入錯誤了。採用了漸進式下溢位後將不會出現這種情況。例如對於單精度浮點數,指數部分實際最小值是(-126),對應的尾數部分從formula_18, formula_19一直到formula_20, formula_21,formula_22相鄰兩小浮點數之間的距離(gap)都是formula_16;而與0最近的浮點數(即最小的非規約數)也是formula_16。

  這裡有三個特殊值需要指出:  以上規則,總結如下:

  單精度二進位制小數,使用32個位元儲存。  S為符號位,Exp為指數碼,Fraction為有效數碼。 指數部分即使用所謂的偏正值形式表示,偏正值為實際的指數大小與一個固定值(32位的情況是127)的和。採用這種方式表示的目的是簡化比較。因為,指數的值可能為正也可能為負,如果採用二補數表示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常採用一個無符號的正數值儲存。單精度的指數部分是−126～+127加上偏移值127,指數值的大小從1～254(0和255是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。  單精度浮點數各種極值情況:

  雙精度二進位制小數,使用64個位元儲存。  S為符號位,Exp為指數碼,Fraction為有效數碼。指數部分即使用所謂的偏正值形式表示,偏正值為實際的指數大小與一個固定值(64位的情況是1023)的和。採用這種方式表示的目的是簡化比較。因為,指數的值可能為正也可能為負,如果採用二補數表示的話,全體符號位S和Exp自身的符號位將導致不能簡單的進行大小比較。正因為如此,指數部分通常採用一個無符號的正數值儲存。雙精度的指數部分是−1022～+1023加上1023,指數值的大小從1～2046(0(2進位制全為0)和2047(2進位制全為1)是特殊值)。浮點小數計算時,指數值減去偏正值將是實際的指數大小。

  浮點數基本上可以按照符號位、指數域、尾數域的順序作字典比較。顯然,所有正數大於負數;正負號相同時,指數的二進位制表示法更大的其浮點數值更大。

  任何有效數上的運算結果,通常都存放在較長的暫存器中,當結果被放回浮點格式時,必須將多出來的位元丟棄。 有多種方法可以用來執行舍入作業,實際上IEEE標準列出4種不同的方法:

  

  下述函式必須提供:

  在二進位制,第一個有效數字必定是「1」,因此這個「1」並不會儲存。

  單精和雙精浮點數的有效數字分別是有儲存的23和52個位,加上最左手邊沒有儲存的第1個位,即是24和53個位。  由以上的計算,單精和雙精浮點數可以保證7位和15位十進位制有效數字。

  C++語言標準定義的浮點數的十進位制精度(decimal precision):十進位制數字的位數,可被(浮點數)表示而值不發生變化。C語言標準定義的浮點數的十進位制精度為:十進位制數字的位數q,使得任何具有q位十進位制數字的浮點數可近似表示為b進位制的p位數字並且能近似回十進位制表示而不改變這q位十進位制數字  但由於相對近似誤差不均勻,有的7位十進位制浮點數不能保證近似轉化為32位元浮點再近似轉化回7位十進位制浮點後保持值不變:例如8.589973e9將變成8.589974e9。這種近似誤差不會超過1位元的表示能力,因此(24-1)*std::log10(2)等於6.92,下取整為6,成為std::numeric_limits<float>::digits10以及FLT_DIG的值。std::numeric_limits<float>::max_digits10的值為9,含義是必須9位十進位制數字才能區分float的所有值;也即float的最大表示區分度。  類似的,std::numeric_limits<double>::digits10或DBL_DIG是15, std::numeric_limits<double>::max_digits10是17

  以下的C++程式,概略地展示了單精和雙精浮點數的精度。
IEEE二進位制浮點數算術標準(IEEE 754)是20世紀80年代以來最廣泛使用的浮點數運算標準,為許多CPU與浮點運算器所採用。這個標準定義了表示浮點數的格式(包括負零-0)與反常值(denormal number),一些特殊數值((無窮(Inf)與非數值(NaN)),以及這些數值的「浮點數運運算元」;它也指明瞭四種數值修約規則和五種例外狀況(包括例外發生的時機與處理方式)。