1. 程式人生 > 其它 >計算機如何儲存浮點數

計算機如何儲存浮點數

前言

計算機使用二進位制來儲存所有資料,對於整數,直接轉成二進位制就可以了,如int型別的15,二進位制表示為

00000000 00000000 00000000 00001111

對於浮點數,如何轉換成二進位制呢,答案是使用IEEE 754標準。

原理

IEEE 754規定,對於32位的浮點數,最高1位是符號位S,接著的8位是指數E,剩下的23位為有效數字M。

對於64位的浮點數,最高1位是符號位S,接著的11位是指數E,剩下的52位為有效數字M。

以32位浮點數為例,計算公式為

  • S: 符號位,0表示正數,1表示負數。
  • E: 指數
  • M: 尾數

以32位浮點數3.25為例,轉為二進位制為11.01,規範表示為1.101 * 21,所以
S=0,
E=1+127=128,二進位制為10000000
M=101(省略掉左側的1之後),不足23位右側補0,超過23位擷取前23位,最終結果為

0 10000000 10100000000000000000000

十進位制表示為1078984704。

Java程式碼

public class Client {

  public static void main(String[] args) {
    System.out.println(Float.floatToIntBits(3.25f));//1078984704
    System.out.println(Float.intBitsToFloat(1078984704));//3.25
    System.out.println(Double.doubleToLongBits(3.25f));//4614500768194494464
    System.out.println(Double.longBitsToDouble(4614500768194494464L));//3.25
  }

}

Java提供了符合IEEE 754標準的表示浮點數的方法,將整型數和浮點數進行轉換。

注意

十進位制轉二進位制,如3.25,整數部分採用除2取餘,逆序排列法,小數部分採用乘2取整法,具體可以檢視10進位制轉2進位制
小數部分在轉換時,有可能剩餘部分一直不為0,一直無限迴圈,我們只能根據精度取有限的位數,這也是浮點數會丟失精度的原因。如

System.out.println(0.3 - 0.2);//0.09999999999999998

結果不是預期的0.1。處理浮點數相關,推薦使用BigDecimal。

參考

IEEE 754浮點數標準詳解
10進位制轉2進位制
浮點數的二進位制表示
計算機如何儲存浮點數