# 淺談計算機編碼(浮點數) ###### 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
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up