Transcript 計算機算數
計算機算術 清大資工系 多媒體資訊檢索實驗室 計算機算術 電腦以0和1表示一切 以0和1的組合,表示千變萬化的數字、文字、圖片、 影像、...... 單純一串0和1的組合,依據解讀方式的不同,會有不 同意義 0100 0001可表示數字65,或是字母'A' 本節課程包含 進位制轉換:二進位、十進位、十六進位 如何表示整數:二的補數法 如何表示小數:IEEE 754標準 整數進位制轉換 10 -> *:短除法 * -> 10:求出「位值」,兩兩相乘並相加 2 -> 16:四個一組做轉換 16 -> 2:轉換為四個一組的0/1 範例: 4610 轉二進位: 101110 11012 轉十進位: 13 1100 01012 轉十六進位: 0xC5 輔助工具 matlab: dec2base, base2dec, ... windows: 小算盤(win7,程式設計師模式) 進位制轉換 電腦的二進位中,一個位數稱為「位元(bit)」 8個位元稱為一個「位元組(Byte)」 4個位元組稱為一個「字(word)」 1024個位元組為1 KB (Kilobyte) 1024 KB為1 MB (Megabyte) 1024 MB為1 GB (Gigabyte) 1024 GB為1 TB (Terabyte) Question: 為什麼標示為500GB的硬碟,實際上只 有大約465GB? 如何表示整數 假設使用四個位數(位元)表示正整數(無號整數) 0000: 0001: 0010: .... 0111: 1000: .... 1111: 0 1 2 7 8 Questions: 15 如果有n個位元,則可以表示0到多 少? 要表示0到100,至少需要幾個位元? 如何表示整數 假設使用四個位數(位元)表示整數(有號整數) 方法一:sign-and-magnitude 最高位(sign bit)為0時為正數,1時為負數 0000: 0001: 0010: .... 0111: 0 1 2 1000: -0 1001: -1 1010: -2 7 1111: -7 缺點一:出現「-0」,位元無法有效利用 缺點二:加法處理較為複雜,要先判斷正負號,例如 2+(-1) 浮點數(小數)表示法中較常利用 如何表示整數 假設使用四個位數(位元)表示整數(有號整數) 方法二:ones' complement 各個位元反相(0/1互換)代表變號 0000: 0001: 0010: .... 0111: 0 1 2 1111: -0 1110: -1 1101: -2 7 1000: -7 缺點:與方法一相同 網路協定中較常利用 如何表示整數 假設使用四個位數(位元)表示整數(有號整數) 方法三:two's complement 各個位元反相(0/1互換)再+1代表變號 0000: 0001: 0010: .... 0111: 0 1 2 7 1111: -1 1110: -2 1001: -7 1000: -8 n個位元,可以表示的範圍:2n-1-1 ~ -2n-1 如何表示整數 加法: 2+3 0010 0011 0101 減法:加上負數 加法: 7 + (-2) 00111 01110 10101 加法(溢位): 4+5 0100 (4) 0101 (5) 1001 (-7) 小數進位制轉換 10 -> *: 方法一:小數部分不斷地乘以2,直到等於0。取每次乘積 的整數部分為結果 0.375 * 2 = 0.75 0.75 * 2 = 1.5 0.5 * 2 = 1.0 --> 0.37510 = 0.0112 方法二:乘以2的某次方,用整數轉換後,再加回小數點 0.375 *23 = 3 ---> 011 ---> 0.011 未必能轉換出有限位數的小數 * -> 10:求出「位值」,兩兩相乘並相加 如何表示小數(浮點數) 類似於「科學記號」 a*10n,1≤|a|<10 例如:一個指數範圍為±4的4位十進制浮點數可以用來表示 43210: 4.321 * 104 4.321: 4.321 * 100 0.0004321: 4.321 * 10-4 但是無法精確表示432.123,因為位數不夠 如何表示小數(浮點數) 標準:IEEE 754 sign: 0為正,1為負 exponent: 指數實際值加上某個固定的偏移值 IEEE 754標準中,該值為2e-1-1 fraction: 小數尾數部分 如何表示小數(浮點數) 在single(單精確度)變數類型中 e: 8 bits 偏移值為28-1-1 = 127 f: 23 bits 在double(倍精確度)變數類型中 e: 11 bits 偏移值為211-1-1 = 1023 f: 52 bits 如何表示小數(浮點數) 範例: 0.37510 = 0.0112以IEEE 754標準表示 -2 0.011 = 1.1 * 2 sign: 0 exponent: 實際值+偏移值 = -2 + 127 = 125 = 0111 1101 fraction: 1000........0 範例: 0.510 = 0.12以IEEE 754標準表示 0.1 = 1.0 * 2-1 sign: 0 exponent: 實際值+偏移值 = -1 + 127 = 126 = 0111 1110 fraction: 0000........0 如何表示小數(浮點數) 範例:將小數 0 1000 0000 11000...0 轉回十進位 (128-127) = 1.11 * 21 = 11.1 = 3.5 1.11 * 2 2 範例:將小數 0 0111 1111 01000...0 轉回十進位 1.01 * 2(127-127) = 1.01 * 20 = 1.012 = 1.25 ※一長串0/1較難閱讀,通常會進一步轉成十六進位表示 如何表示小數(浮點數) 正規型式 前方沒有leading 0s,即開頭的1不用儲存 --> hidden 1 exponent值在[1, 254]之間(倍精則在[1 2046]之間) 非正規型式 前方有leading 0s exponent值為0 偏移值為126(倍精為1022) 目的:避免正規型式和0中間的gap 如何表示小數(浮點數) 特殊值(倍精,matlab中定義的函式/常數): eps: 從1到下一個值的距離 1: 0 01111 111111 000......0 下一個值: 0 01111 111111 000......1 差距:1.000...1*20 - 1*20 = 0.000...1*20 = 1*2-52 ---> 0 01111 001011 000......0 如何表示小數(浮點數) 特殊值(倍精,matlab中定義的函式/常數): realmax: 最大的浮點正數 0 01111 111111 111......1 約為1.7977*10308 realmin: 最小的浮點正數(正規型式) 0 00000 000001 000......0 約為2.2251*10-308 如何表示小數(浮點數) 精確度問題: 0.110 = 0.210 = 0.310 = 0.110+0.210 = 0 0 0 0 01111 01111 01111 01111 111011 111100 111101 111101 1001......10011010 1001......10011010 0011......00110011 0011......00110100 如何表示小數(浮點數) 有效位數: 單精:224 = 1.6777*107 ---> 7位 倍精:253 = 9.0072*1015 ---> 15位 可依此評估演算法的好壞差異 單精:誤差在10-7左右為可接受範圍 倍精:誤差在10-15左右為可接受範圍 如何表示小數(浮點數) 適當的計算順序可以減少誤差 範例:解ax2+bx+c=0,a=c=10-10,b=1010 2 20 d = b -4ac ≈ 10 x(+) = (-b+sqrt(d))/(2*a) = 0 (+) = 10-20 若用如下方式計算,則x x(+) = (-b+sqrt(d))*(b+sqrt(d))/(2*a*(b+sqrt(d))) = (d-b2)/(2*a*(b+sqrt(d))) = (-4*a*c)/(2*a*(b+sqrt(d))) 練習題 (25%) 若將學號末三碼以十進位解讀,則轉為十六進位為多少? 請以win7的小算盤計算之 (25%)將常數pi轉換成IEEE 754標準的倍精度浮點數時,其三個 欄位的值各是多少?請以「IEEE 754」、「matlab」等關鍵字, 搜尋網路上的matlab函式進行相關計算 (自行練習)如何將0.625以IEEE 754單精度表示? (自行練習)如何將IEEE 754倍精度表示的0x3fe8000000000000 轉為十進位小數?