floating-point浮點入門


備註

本節概述了浮點是什麼,以及開發人員可能想要使用它的原因。

它還應該提到浮點內的任何大型主題,並鏈接到相關主題。由於浮點文檔是新的,您可能需要創建這些相關主題的初始版本。

概觀

浮點是什麼?

有兩種類型的數字:

  • 在小數點之前和之後可以獲得一定數量的數字的固定點。
  • 浮點數,其中有一定數量的數字可用於尾數和指數。

使用小數點前三位小數和小數位後兩位小數的小數位的示例:

  • 0表示為000.00
  • 0.123將表示為000.12
  • 0.00123將表示為000.00
  • 1表示為001.00
  • 1.123將表示為001.12
  • 1.00123將表示為001.00
  • 123.456將表示為123.45
  • 1234.56是一個錯誤,因為它將被存儲為234.56,這是錯誤的

使用十進制數字的示例,尾數為五位小數,指數為小數點後一位:

  • 0可以表示為.00000 x 10 ^ 0
  • 0.1可以表示為.10000×10 ^ 0
  • 0.0000123456可表示為.12345 x 10 ^ -4
  • 0.000000000123456可表示為.12345 x 10 ^ -9
  • 0.00000000001是一個錯誤,因為指數不足以存儲數字
  • 1可以表示為.10000 x 10 ^ 1
  • 1.123可以表示為.11230 x 10 ^ 1
  • 1.00123可以表示為.10012 x 10 ^ 1
  • 123.45678可以表示為.12345 x 10 ^ 2
  • 123456789.1可以表示為.12345 x 10 ^ 9
  • 1000000000是一個錯誤,因為指數不足以存儲數字

因此,浮點數可以表示具有非常不同大小的數字(0.000000000123456和123456789.1),具有相同的相對精度。

當始終需要特定數量的小數位時,無論數字的大小(例如金錢),定點數都很有用。當幅度變化且仍需要精確度時,浮點數很有用。例如:對於道路工程師而言,距離以米為單位測量,而.01米的距離是微不足道的,但對於微芯片設計師而言,0.0000001米和.000000001米之間的差異是巨大的 - 物理學家可能需要使用大量的數據而且非常非常同一計算中的微小數字。許多不同大小的準確度使得浮點數有用。

這個怎麼運作

計算機不使用十進制 - 它們使用二進制並導致浮點問題,因為並非每個十進制數都可以用浮點數精確表示,並且會在計算中引入舍入誤差。

以十進製完成所有示例之後,請務必注意,因為它們是二進制的,而不是將浮點數存儲為小數部分的總和:

123.875 = 1/10^-2 + 2/10^-1 + 3/10^0 + 8/10^1 + 7/10^2 + 5/10^3
 

計算機將浮點數存儲為二進制分數的總和:

123.875 = 1/2^-6 + 1/2^-5 + 1/2^-4 + 1/2^-3 + 1/2^-1 + 1/2^0 + 1/2^1 + 1/2^2 + 1/2^3
 

有許多不同的方法可以存儲代表這些分數的位圖,但現在大多數計算機使用的是基於IEEE-754標準。它具有存儲十進制和二進製表示以及不同大小數據類型的規則。

使用IEEE標準存儲正常數字的方式是:

  • 符號的一位 - 存儲在MSB中,1表示負數,0表示正數
  • 指數的一些位 - 減去偏差以得到正指數和負指數
  • 尾數的一些位 - 小數位後面的數字,小數位前面有一個隱含的1。

為了允許更漸進的下溢,非規格化數字(當指數位全為零時)被特別處理:指數設置為-126並且小數位之前的隱式前導1不被添加到尾數。

32位IEEE-754浮點數

對於普通的32位IEEE-754浮點數:

  • 第32位是標誌
  • 位24-31是指數 - 偏差是127
  • 位1-23是尾數

所以正常數字計算如下:

-1^sign * 2^(exponent-bias) * 1.mantissa
 

如果位模式是:

0 10000101 11101111100000000000000
 

然後價值是:

-1^0 * 2^(133-127) * 1.111011111
-1^0 *     2^6     * (1 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256 + 1/512)
   1 *      64     * 991/512
         123.875
 

有一些特殊的價值觀:

0 11111111 11111111111111111111111 = NaN
0 11111111 00000000000000000000000 = +infinity
1 11111111 00000000000000000000000 = -infinity
0 00000000 00000000000000000000000 = +Zero
1 00000000 00000000000000000000000 = -Zero
 

32位IEEE-754格式的細節可以在以下位置找到: