計算機算數

Download Report

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