---
# System prepended metadata

title: 淺談計算機編碼(浮點數)

---

# 淺談計算機編碼(浮點數)
###### 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 的雙精度，雙精度能夠表示浮點數的範圍大小很明顯就是大於單精度。

![image alt](https://i.imgur.com/zR9LsIH.png)


#### 浮點數型態
> 根據 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$。
       

