概述

浮點是什麼?

有兩種型別的數字:

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

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

  • 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 格式的細節可以在以下位置找到: