# Digitization ###### tags: `Computer Science ` ## 浮點數表示法 如果說電腦只能用0和1來表示的話,那麼小數又要怎麼表示呢? 這時候就需要參考 "IEEE754",也就是"二進位浮點數算數標準"了, 正如其名這個標準是由"IEEE(Institute of Electrical and Electronics Engineers)"所制定的,提供了浮點數在電腦中的表示標準,好讓眾多的電腦公司可以有個共同的準則可以遵循,以便於電腦的製程。 https://78802328-a-62cb3a1a-s-sites.googlegroups.com/site/nutncsie10412/ge-ren-jian-jie/fu-dian-shu-biao-shi-fa/IEEE754.gif?attachauth=ANoY7cpzMZqYaV5ixmQPgsY8paG2gIFmmu_TJmw6dO1mvKkbSA3fi_6kXuX53NKQhYAAAx-8lnp3FgOvnf_OmIeyqqkMEaImXmBHoNgw_2ysWc93xZY-8Yy95IoWtHf_yhBBmsEMSlN1YUlX1LS8Aky1ZpWulwvMso3YSAsDs_HcxucJcobTZ9B0PMxCYMxMBrazHCWClYk6ZUUrxyYNp_4HdkK94exmOwd7vySYD3uCD7YVdqcw50YI7PTYWIITHFih29yx6xoRCflAn3hQl-_H_q7l5oDq7A%3D%3D&attredirects=0 IEEE754 當中的S指的是"Significand",也就是這個數字的正負號,1代表負數,0代表正數,而exponent則代表指數部分,也就是這個數的次方數,mantissa則代表尾數部分,也就是真正表示這個數字樣子的地方,相信只講了一堆名稱,大家應該還是不太懂到底該怎麼來使用這個IEEE754吧? 不要急,讓我們慢慢來,首先,大家應該知道"科學符號(Scientific notation)"吧? 不知道的話,請自行去查詢,這邊不負責這部分的講解,也就是說,要把一個二進位的浮點數用IEEE754的方式來表示的話,必須先把它轉換成科學符號才行,像這樣: 10.5 (D) = 2^3 + 2^1 + 2^-1 = 1010.1 (B) = 1.0101 * 2^3 關於小數點後的二進位數字要怎麼轉換的問題,就只能靠同學們自己運算,比方說 0.75(D) = 0.5 + 0.25 = 2^-1 + 2^-2 = 0.11 (B) , 轉換完之後,再將數字轉換成科學符號的格式,也就是指留最左邊的1在小數點前,再把剩下的數字通通一到小數點後面,這樣子前置準備就算做好了,再來就要開始進行IEEE754的轉換了,可以分成以下的步驟: 1. 若是正數,則 S = 0,若是負數,則 S = 1,以上面的例子來說,就是這樣: 1.0101 * 2^3 >0 ,所以 S = 0。 2. 將該數的次方數加上127並填數exponent中,以上面的例子來說,就是這樣: 1.0101 * 2^3 ,所以exponent = 3 + 127 = 130 = 10000010,注意exponent 這邊是用二進位來表示的喔。 3. 將小數點以下的部分填進 mantissa 裡,以上面的例子來說,就是這樣: 1.0101 * 2^3 ,所以 mantissa = 01010000000000000000000,注意填的時候要從左填到右,不夠的位數補0就可以了。 經過以上的步驟,一個IEEE754的浮點數就大功告成了,以上面的例子來說,最後是長這樣: 1.0101 * 2^3 = 0 10000010 01010000000000000000000 不過,當然不是這樣子就完全沒問題了了,相信大家應該會感到疑惑,為什麼 exponent 需要加上127呢? 其實是就是為了表示非常小的數字,舉例來說,如果我們想表示 1.0101 * 2^-100 呢? 這時候 exponent 就會變成 - 100 + 127 = 27 = 00011011,所以整個就是長這樣: 1.0101 * 2^-100 = 0 10000010 01010000000000000000000 至於為什麼是加127的原因的話,那是因為加上 127 剛好能讓 exponent 的次方數落在以下的範圍內: -127 < exponent < +128 ,左右的範圍差不多,這樣子在使用上也比較方便,像這樣的數我們便稱之為 "指數偏移植(exponent bias)",基本上可以用這條公式算得出來: exponent bias = 2^(m-1) -1 當中,m 為 exponent 的位元數,所以,以 IEEE double precision float point 的標準來說, exponent bias 就是 2^(11 - 1) - 1 = 1023。 接下來,若是我們想表示負數的話該怎麼辦呢? 舉例來說: -17.75 = - (17.75) = - (10001.11) = - (1.000111 * 2^4),讓我們套用上面的三個步驟: 1. 因為是負數,S = 1。 2. exponent = 127 + 4 = 131 = 10000011。 3. mantissa = 00011100000000000000000。 所以 -17.75 = 1 10000011 00011100000000000000000。 另外以下還提供幾個數字轉換,希望還不熟的同學可以參考看看: Ex1. 5.75 求 IEEE 5.75 = 5 + 0.5 + 0.25 = 101.11 = 1.0111 * 2^2 a. 5.75 > 0 , S = 0 b. exponent = 2 + 127 = 129 = 10000001 c. mantissa = 0111000000000000000000 5.75 (D) = 0 10000001 0111000000000000000000 (IEEE) Ex2. -161.875 求 IEEE -161.875 = -(161 + 0.5 + 0.25 + 0.125) = -(10100001.111) = -(1.0100001111 * 2^7) a. -161.875 < 0 ,S = 1 b. exponent = 127 + 7 = 134 = 10000100 c. mantissa = 01000011110000000000000 -167.875 (D) = 1 10000100 01000011110000000000000 Ex3. -0.0234375 求 IEEE -0.0234375 = -(0.015625 + 0.0078125) = -(0.0000011) = -(1.1 * 2^-6) a. -0.0234375 < 0 ,S = 1 b. exponent = 127 + (-6) = 121 = 01111001 c. mantissa = 10000000000000000000000 -0.0234375 (D) = 1 01111001 10000000000000000000000 (IEEE) Ex4. 11001010000000000111000100001111 (IEEE) 求 Decimal = 1 10010100 00000000111000100001111 設定答案 N = A * 2^x a. S = 1 ,所以 N < 0 b. 10010100 = 148 = 127 + x ,所以 x = 21 c. A = 1 + mantissa = 1.00000000111000100001111 N = - (1.00000000111000100001111 * 2^21) = - (1000000001110001000011.11) (B) = - (2104378.75) (D) = -2104378.75 (D) # Representing Video 影像解碼器採用兩種壓縮方式:時間壓縮和空間壓縮。 ## Temporal compression(時間壓縮) 一種基於連續幀之間差異的技術:如果兩幀中的大多數圖像都沒有改變,為什麼我們要浪費空間來存所有相似資料訊息? 選擇一個關鍵幀作為比較差異的基礎,並存儲其整個圖像。 對於連續圖像,僅存儲更改(稱為delta frames增量幀)。 時間壓縮在逐幀變化不大的影像(例如運動很少的場景)中非常有效。 ## Spatial compression(空間壓縮) 一種基於刪除幀中冗餘資料訊息的技術:該問題與壓縮靜態圖像時面臨的問題基本相同。 空間影像壓縮通常將像素分組為具有相同顏色的區塊(rectangular areas矩形區域),例如晴朗的藍天的一部分。 不是存儲每個像素,而是存儲區域的顏色和坐標。