# 淺談計算機編碼(浮點數) ###### tags: basic > 浮點數 $(floating point)$ 就是大家一般所熟知的小數點,這個看似簡單的數字表示,在計算機中卻需要另外一種編碼形式來表示這樣的數字模式。 > 在 $60-70$ 年代期間,各個電腦公司都有自己浮點數編碼的標準,直到 $1985$ **IEEE 754** 浮點數標準的推動。 ## 實驗環境 ```shell $ uname -a Linux noah-UX330UA 4.15.0-43-generic #46~16.04.1-Ubuntu SMP Fri Dec 7 13:31:08 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux $ gcc -version gcc (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010 ``` ### 二進位的小數表示法 * 在介紹 **IEEE 754** 前先來看看如何用二進位來表示十進位。 * 這是十進位的小數點表示方式 $d = \displaystyle\sum_{i=-n}^m10^i \cdot d_i$,小數點左邊是 10 的正冪用來表示整數位的部份,右邊是 10 的負冪是用來表示小數點的部份。 * 二進位的部份其實與十進位相當類似,只是底數從 10 換成 2,表示的公式如下,$b = \displaystyle\sum_{i=-n}^m2^i \cdot b_i$。 * 範例 $101.11$ $1x2^2+0x2^1+1x2^0+1x2^{-1}+1x2^{-2} = 4 + 0 + 1+\dfrac{1}{2} + \dfrac{1}{4} = 5\dfrac{3}{4}$ ### IEEE 754 > 如果使用一般的二進位小數表示法會遇到一個問題,就是浮點數能夠表示的位數將會變得非常小,在限定的 64 bits 或 32 bits 中,小數點後的數字跟整數位的數字會彼此競爭有限資源,而 **IEEE 754** 就是利用特殊的編碼模式來解決這個問題。 :::info $V = (-1)^s \times M \times 2^E$ ::: 以上的形式是 754 用來表示浮點數的式子。 :::warning **s** : 用來表示此浮點數是正還是負的,如果 s = 0 就代表此為正,s = 1 則為負。 **M** : 是一個二進位的小數(就前面說的那個),第一位都為 1,後幾位的表示為 2 的負冪次。 **E** : 此數是用來作 2 的冪次來對浮點數作加權,$E = exp - bias$。 :notes: 不太懂嘛?沒關係先慢慢看下去後面會有例子。 ::: #### 浮點數表示位數 > 浮點數根據其位數大小可以分成兩種,一個為 32 bits 的單精度,另外一個為 64 bits 的雙精度,雙精度能夠表示浮點數的範圍大小很明顯就是大於單精度。  #### 浮點數型態 > 根據 exp 值會有三種浮點數型態,1. Normalized 2. Denormalized 3. Special :::success **符點數表示式** $V = (-1)^s \times M \times 2^E$ ::: * **Normalized** 這是正常最常見的浮點數表示型態,當 exp 中的值並非全為 0 或全為 1 時,在這個型態的浮點數計算方式為。 * Step 1 先找出在這個精度上 bias 大小 * $bias = 2^{k-1}-1$ { $k$為 $exp$ 的大小 } * Step 2 計算 exp * 將 $bias$ 減掉 $exp$ 中的值就為在浮點數表示式中的 $E$。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.