iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

https://ithelp.ithome.com.tw/upload/images/20230924/20149362tmgXTZhQnm.png

看到首圖,你可能就想點出這篇文章了🤣
我們今天依舊要來算的數學,講比較抽象的概念
廢話不多說就直接開始吧!

浮點數表示法(Floating Point Number)

「浮點數表示法」是電腦表示「實數」最常用的方式,類似十進位的科學記號表示法,目前所採用的「浮點數表示法」都是以 IEEE745 為運算標準
之所以稱為「浮點數表示法」,是因其小數點是浮動的,在有限位元的情況下,我們所能表示的數值範圍比起固定小數點(定點數)還要大以及彈性許多,依位元數可以分為「半精度浮點數」、「單精度浮點數」、「雙精度浮點數」,IEEE 754 將浮點數值分成以下三部份組成:

1. 符號(Sign,縮寫:S)

  • 代表這個數值的「正」、「負」符號
  • 1 個位元
  • 0 表示正數, 1 表示負數

2. 指數(Exponent, 縮寫:E)

  • 以 Excess127(過剩127)方式表示,就是將「位元數值」減去 127 ,才會是原本所儲存的值。例如:2 ^ 8 = 256 bits, 所能儲存的位元數值為 0 ~ 255 ,若位元數值為 100 ,則所存的數值為 -27。如此一來,就可以表示 -127 ~ +128 的所有整數值

3. 尾數(Fraction,縮寫:F)

  • 代表小數部分
  • 不夠的位元就補 0

「指數」和「尾數」的位元數依照不同浮點數表示法而有所不同,這裡用表格來呈現:

浮點數表示法 | 符號(S) | 指數(E) |尾數(F)
------------- | -------------
半精度浮點數 | 1 位元 | 5 位元 | 10 位元
單精度浮點數 | 1 位元 | 8 位元 | 23 位元
雙精度浮點數| 1 位元 | 11 位元 | 52 位元

介紹了浮點數表示法的組成部分後,這裡附上一個將「實數」轉換成「浮點數」的計算公式:
如果你看不懂這公式,先別緊張!!也不需要特別背它
透過例子(後面會有)熟悉轉換流程,後面自然就可以慢慢理解公式

https://ithelp.ithome.com.tw/upload/images/20230924/20149362b0qqbkKWP1.png
圖片取自[Verilog入門教學] 背景知識#7 浮點數

[補充]

  • bias 的數值通常是 Exponent 所能表示的最大數值的一半

半精度浮點數

https://ithelp.ithome.com.tw/upload/images/20230924/20149362XJah2ge8bm.png
總共有 16 位元,只適合存儲對精度要求不高的數字,不適合用來計算。與單精度浮點數相比,優點是只需要一半的存儲空間,但是就犧牲了精準度和數值範圍


單精度浮點數(Single Precision)

也可以叫「單倍精準數」,總共有 32 個位元,是 C 語言中的 float 型態,若要將數值轉換為 IEEE745「單精度浮點數」的步驟如下:

  • STEP1: 如果是「正數」,S = 0; 如果是「負數」,S = 1

  • STEP2: 將數值轉換為「二進位」表示,可以分為「整數部分」和「小數部分」。你可以先理解為「整數部分」是不斷地除以 2 ,「小數部分」則是不斷地乘以 2 。之後再把整數和小數的結果合在一起

  • STEP3: 將 STEP2 的結果變成 1.F 的形式, E(指數)的部份 = 小數點移動的 X 位(偏移量) + 127(加上127是以 Excess127(過剩127)方式表示),並把結果轉換為二進位

  • STEP4: 填入「尾數」的小數點數值

講了那麼多,直接來看例子吧 /images/emoticon/emoticon06.gif,為了易讀,每四個 bit 就會用底線(_)區隔開來

範例一:將 -11.3 轉為「單精度浮點數」,數值為多少?
STEP1: 因為是負數,所以 S(符號) = 1

STEP2: 11.3 的「整數部分」是「11」轉換為二進位為 1011 ,「小數部分」是「0.3」轉換為二進位為 0.0100_1100_1100...,後面數值都是 1100 ,所以用 ... 省略,將「整數部分」和「小數部分」合起來就是 1011.0100_1100_1100...

STEP3: 將1011.0100_1100_1100... 變成 1.F的形式,結果為 1.011_0100_1100_1100...,由於小數點右移了3位,所以可以得到 E(指數) = 3 + 127 = 130 ,轉換為二進位為 1000_0010

STEP4: F(尾數)就是「剩下的小數點部分」 ,F = 0110_1001_1001_1000...

合併幾來如下圖所示:

https://ithelp.ithome.com.tw/upload/images/20230924/20149362KXHGUERZy4.png


雙精度浮點數(Double Precision)

也可以叫「雙倍精準數」,總共有 64 個位元,是 C 語言中的 double 型態,計算步驟跟「單精度浮點數」差不多,比較需要注意的是「指數」和「尾數」的佔用位元數不同

此外,javaScript 是弱型別,對於數值的處理,不論是整數或是有小數,都只有一種型別,那就是 Number,而且 是以 64 位元的雙精浮點數來計算,但浮點數的尾數(Fraction, F)因為位元數有限,如果超過的話,數值資料就會通通遺失,其計算後的結果值就會有尾數誤差,有些人把這個結果稱為浮點數的陷阱

總結

「浮點數表示法」都是以 IEEE745 為運算標準,由「符號(S)」、「指數(E)」、「尾數(F)」組成。依照總位元數可以分為「半精度」、「單精度」、「雙精度」浮點數,總位元數越多的浮點數,所表示的數值範圍就可以越大,計算也相對精準。但浮點數的尾數(Fraction, F)因為位元數有限,如果超過的話,數值資料就會遺失,其計算後的結果值就會有誤差,這也是浮點數會損失精確度的原因

BTW 今天這篇文章可說是目前寫過最抽象,也較難解釋的單元><,在整理文章前反覆看了許多講解浮點數的文章和視頻,如果有哪邊可以調整或講錯的地方請糾正我!!甘溫吶~~

線上轉換器

參考資料

  1. 浮點數不只是你想像的小數點
  2. 台大-數位資料表示法
  3. [Verilog入門教學] 背景知識#7 浮點數
  4. wikipedia

上一篇
Day 9|電腦如何表示整數? 整數表示法 - 一補數、二補數
下一篇
Day 11 | 進位表示法的轉換(上) -【十進位】和【二進位】的互換
系列文
來場計概入門課吧X資訊人該了解的通識素養31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言