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
轉為十進位小數?