Giáo trình Toán rời rạc Chương 2.3

8 586 0
Giáo trình Toán rời rạc Chương 2.3

Đang tải... (xem toàn văn)

Thông tin tài liệu

Giáo trình Toán rời rạc

o Biểu diễn số nguyên trong máy tính.Trong máy tính mọi dữ liệu đều được lưu trữ bằng các tín hiệu nhò phân. Mô hình toán học tương ứng cho cách lưu trữ đó là số học hệ đếm nhò phân. Trong hệ đếm này các dữ liệu được biểu diễn bằng một dãy các số 0 và 1. Hơn nữa tài nguyên của máy tính là hữu hạn, các thanh ghi của bộ xử lí hay chiều dài mỗi đơn vò bộ nhớ là hữu hạn, vì vậy ta chỉ xét đến cách biểu diễn số bằng các thanh ghi có chiều dài hữu hạn mà thôi. Mặt khác với cùng một biểu diễn nhò phân, các cách xử lí khác nhau đối với biểu diễn này sẽ cho ý nghóa dữ liệu khác nhau. Ví dụ: Trong máy tính biểu diễn 0100 0001 có thể là số thập phân 65 hay là kí tự ‘A’ tuỳ theo cách xử lí đối với biểu diễn này. Từ đó ta có khái niệm “Kiểu dữ liệu – Data type”: Một kiểu dữ liệu là một cách biểu diễn dữ liệu trong máy tính đi kèm với phương thức mà máy tính xử lí cách biểu diễn đó.Để dễ dàng cho việc lập luận, sau đây ta giả sử dữ liệu được biểu diễn bằng một thanh ghi 4 bit trong một máy tính giả đònh . Kiểu số nguyên không dấu: Trước tiên ta xem xét cách biểu diễn số nguyên trong hệ thập phân (Decimal system). Trong hệ thống này ta dùng 10 kí hiệu 0,1,2,3,4,5,6,7,8,9 và cách ghi theo thứ tự các chữ số để biểu diễn giá trò số đó. Ví dụ:75689 = 70000 + 5000 + 600 + 80 + 9= 7.104+ 5.103+ 6.102+ 8.101+ 9.100Tổng quát ta có:01232n1nnaaaa .aaa−−dec = ∑=n0iii10.a trong đó: ∀i=n 0 : ai { }9,8,7,6,,5,,4,3,2,1,0∈Với cùng nguyên tắc biểu diễn đó, trong hệ nhò phân (Binary system) ta chỉ dùng 2 kí hiệu 0,1 để biểu diễn số nguyên như sau:01232n1nnaaaa .aaa−−bin = (∑=n0iii2.a ) dec trong đó: ∀i=n 0 : ai { }1,0∈Vậy trong hệ này, ta có:101110bin =1.25 + 0.24 + 1.23 + 1.22 + 1.21 + 0.20 dec = (32+0+8+4+2+0)dec=46dec.Khác với biểu diễn số nguyên trong toán học, trong máy tính ta chỉ có thể dùng các thanh ghi với độ dài hữu hạn để biểu diễn số nên phạm vi số nguyên biểu diễn được là hữu hạn. Chẳng hạn với thanh ghi 4 bit ta chỉ có thể biểu diễn được các số:Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15Binary 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111rình toán cao cấp 1'>1 2 3 4 5 6 7 8 9 10 11 12 13 14 15Binary 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111Một cách tổng quát với n bit thì có thể biểu diễn 2n số nguyên không dấu trong phạm vi từ số 0 đến 2n-1 dec. 50  Kiểu số nguyên có dấu: Chúng ta biết rằng các phép toán cơ bản +, - ,* , div đối với số nguyên trong số học đều có chung một tính chất hết sức quan trọng là chúng đều “đóng kín” đối với các phép toán đó. Nghóa là với hai số nguyên a và b bất kì ta đều có a+b, a-b, a.b, a div b đều là các số nguyên. Với cách biểu diễn số nguyên không dấu trong máy tính như trên tính “đóng kín” không còn bảo toàn được nữa, chẳng hạn:- Tràn số : 7dec+10dec=0111bin+1010bin= ? bin (Tràn số. Không thể biểu diễn được với 4 bit)- Không có cách biểu diễn: 7 dec – 10 dec = ? (Số âm).Vấn đề tràn số không thể giải quyết được trừ khi phải mở rộng độ dài thanh ghi. Chẳng hạn, vì 215 –1 = 32767 < 60032 < 216 –1 = 65535 nên muốn biểu diễn số 60032dec ít nhất chiều dài của thanh ghi phải là 16 bit. Nếu không mở rộng thanh ghi (nghóa là chuyển sang một kiểu dữ liệu khác) kết quả tính toán có thể đem lại nhiều bất ngờ. Sử dụng lại ví dụ trên ta thấy phép cộng:1 10 1 1 1+1 0 1 01 0 0 0 1cho kết quả của phép cộng là: 0001. (Không đúng!)Về vấn đề số âm :Để khảo sát số âm trước hết chúng ta khảo sát phép trừ. Sử dụng cách trừ như thông thường với phép trừ thực hiện lần lượt từ cột bên phải qua ta thấy rằng khi ta trừ 1 cho 0 ta được 1, trừ 1 cho 1 ta được 0 còn khi trừ 0 cho 1 ta cần “mượn” 1 từ cột kế cận bên trái là cột mà quá trình tính toán chưa xét tới. Việc mượn 1 từ cột kế bên trái này có thể gây ra mượn dây chuyền từ cột này qua các cột kế tiếp về phía bên tráiA B Hiệu số Mượn0 0 0 00 1 1 11 0 1 01 1 0 0 Các ví dụ sau đây cho ta thấy quá trình đó đã lan truyền như thế nào:51Số phải nhớ đem từ cột bên phải quaSố này không thuộc thanh ghi quảKếttrừSốtrừbòSốtrái cột bêntừ Mượn 0101101011 1101000011111011001111Một mặt thực hiện phép toán trừ như vậy gây ra rất nhiều bất tiện. Mặt khác khi phép trừ cho một kết quả âm buộc ta phải đònh nghóa một kiểu dữ liệu có thể biểu diễn được số nguyên âm. Ta có thể biểu diễn số âm bằng cách dùng 1 bit tận cùng bên trái của thanh ghi làm bit dấu. Theo qui ước nếu bit này bằng 0 thì đây là số dương và nếu bit này bằng 1 thì đây là số âm. Ví dụ 0101bin là số +5 còn 1111bin là số –7. Tuy nhiên khi đó thực hiện phép trừ giữa hai số “đại số” A và B đòi hỏi một qui tắc trừ khá phức tạp vì cùng lúc phải xét đến dấu của A, B và độ lớn tương đối giữa A và B chưa kể đến việc phải thiết kế một mạch điện tử riêng biệt dùng để thực hiện phép trừ. Câu hỏi đặt ra là có thể nào chỉ cần thiết kế một mạch điện tử dùng được cho cả hai phép toán cộng và trừ. Câu trả lời là có thể.Nhưng trước hết ta hãy quan sát ví dụ sau đây trong hệ thập phân, trong đó ta đã thay việc thực hiện quá trình làm toán trừ bằng một quá trình “cộng” tương đương:901943854− được thay bằng 90190111056854++Ta thấy rằng, thay vì trừ cho 349 ta đã cộng 458 với 650 là số bù 9 của số 349, rồi lại cộng với 1 để được kết quả 1109. Kết quả này bỏ đi số 1 tận cùng bên trái sẽ được 109 là kết quả của phép trừ. Kết quả này chắc đúng vì ta có đẳng thức:y - x = y+(10k – x) – 10k =y+[ (10k –1) –x] + 1 – 10k.Số hạng 10k – 1 luôn luôn có dạng 99 .9 vì vậy phép trừ [ (10k –1) –x] =[99 .9 – x] luôn luôn dễ thực hiện bằng cách lấy số bù 9 của từng số hạng biểu diễn x mà không phải “mượn” gì cả!Còn việc bỏ đi số hạng cuối cùng chẳng qua là lấy kết quả sau khi cộng với số bù 10 trừ đi cho 10k. Việc khử đi vò trí “dư” này trong máy tính tương đương với việc tràn số ở bit tận cùng bên trái.Từ nhận xét trên ta có thể nói số bù 10: (651) chính là số âm (-349) với điều kiện khi cộng với (651) phải khử đi bit cuối cùng về bên trái.Và cũng từ nhận xét trên ta có thể đònh nghóa số có dấu x như sau: Cho một số nguyên có biểu diễn nhò phân x, số có dấu của x, kí hiệu (-x), chính là số bù 2 của x (ie: 2n – x). Để tính được số bù 2 của x chỉ cần tính số bù 1 của x rồi cộng thêm 1.52Sau khi đã bỏ số 1 tận cùng bên trái Ví dụ: x = 5dec = 0101binLấy bù 1: 1010Cộng 1 được số bù 2: 1011Khi đó ta có: (-x) = 1011bin.Thử lại: 0101+ 1011 1 0000Bảng sau đây cho thấy quan hệ giữa các số bù 2 khi dùng 4 bit để biểu diễn số nguyên:Thập phân Biểu diễn nhò phân Thập phânKiểu dữ liệu có dấuKiểu dữ liệu không dấu00000 0-1 151111 00011 1-2 141110 00102 2-3 131101 00113 3-4 121100 01004 4-5 111011 01015 5-6 101010 01106 6-7 91001 01117 710008 8Đối chiếu trong bảng trên ta thấy cùng dùng 4 bit để biểu diễn số thì kiểu dữ liệu số nguyên không dấu có phạm vi biểu diễn từ 0 đến 15 trong khi kiểu dữ liệu số nguyên có dấu có phạm vi biểu diễn từ -7 đến +8. Cùng một biểu diễn 1100 có thể là +12 nhưng cũng có thể là (-4) tuỳ theo kiểu dữ liệu được quan niệm. eg: 1010 + 0010 = 1100 có thể quan niệm là:10 + 2 =12 (Kiểu số nguyên không dấu)hoặc: -6 +2 = -4 (Kiểu số nguyên có dấu).Mặc dù kích thước lưu trữ dữ liệu như nhau nhưng cách xử lí dữ liệu với mỗi kiểu dữ liệu là khác nhau. 53Số 1 này bò tràn khỏi thanh ghi.  Cộng/Trừ số nguyên với số bù 2: Khi biểu diễn số nguyên dưới dạng số bù 2 chúng ta có thể thực hiện các phép toán cộng và trừ như bình thường. Ví dụ:5dec – 3dec = 0101bin + 1101bin = 0010bin= +2dec-5dec + 3dec = 1011bin + 0011bin = 1110bin= -2dec-5dec - 2dec = 1011bin + 1110bin = 1001bin = -7dec5dec + 4dec = 0101bin + 0100bin = 1001bin = -7decDòng cuối cùng cho kết quả sai vì vượt quá phạm vi biểu diễn (từ -7 đến +8)o Biểu diễn số thực trong máy tính:Có thể hiện thực số thực trong máy tính bằng một trong hai cách :Biểu diễn theo kiểu dấu chấm tónh (fixed point representation):Giả sử ta dùng một thanh ghi 16 bit để biểu diễn số thực như sau:16 bit0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 1 6 bitBit dấu Dấu chấm nhò phân giả đònh(Biểu diễn theo kiểu dấu chấm tónh trong bộ nhớ số + 111010111.110011)Với qui ước như trong hình trên thì số thực dương lớn nhất và nhỏ nhất có thể biểu diễn được là:(Maximum) 111111111.111111bin = (29-1).(1-2 - 6)dec= 511.984375dec(Minimum) 000000000.000001bin= 2-6 = 0.015625decVới cách hiện thực này ta gặp phải mấy vấn đề sau:i) Không thể biểu diễn số thực khác 0 có giá trò tuyệt đối nhỏ hơn 0.015625ii) Không thể biểu diễn số thực có giá trò tuyệt đối lớn hơn 511.984375iii) Mật độ biểu diễn số thực: Giữa hai số thực bất kì x và y (x ≠y) luôn tồn tại một số thực khác (eg: (x+y)/2) cho dù x có gần y đến thế nào đi nữa, ie: số số thực tồn tại giữa x và y là vô hạn. Giữa hai số thực 0 và 511.984375 là vô hạn các số thực có giá trò trung gian, nhưng theo cách biểu diễn trên giữa số 0 và số 511.984375 chỉ có thể hiện thực đúng 215 = 65535 số thực không âm khác nhau. Nói cách khác độ chính xác của số được biểu diễn bò ảnh hưởng nghiêm trọng!54 Biểu diễn theo kiểu dấu chấm động (floating point representation):Trong ba vấn nạn trên thì vấn nạn cuối cùng không thể giải quyết được vì thuộc bản chất hữu hạn của biểu diễn số trong máy tính (và chỉ có thể bỏ qua bằng cách chấp nhận khả năng làm tròn số mà thôi!). Hai vấn nạn đầu tiên liên quan đến phạm vi biểu diễn số có thể giải quyết được phần nào bằng một trong hai cách:a) Tăng kích thước thanh ghi: Biện pháp này không đem lại nhiều hiệu quả. Không cải thiện được bao nhiêu phạm vi biểu diễn số.b) Nếu tách vấn đề độ chính xác ra khỏi bài toán biểu diễn số thì theo kí pháp khoa học (scientific notation) quen thuộc mỗi số thực n đều có thể viết dưới dạng:n = f x 10etrong đó f là phân số (fraction) hoặc là phần đònh trò (mantissa) còn e là số nguyên (âm hay dương) gọi là phần mũ (exponent).Ví dụ: -3.14 = (-0.314) x 1010.00001 = 0.001x10-2 = 0.1 x 10-41941 = 0.194100 x 104Ta nhận thấy rằng bằng cách di động dấu chấm thập phân đồng thời thay đổi phần mũ bao giờ cũng có thể (chuẩn hoá) làm cho phần đònh trò, về giá trò tuyệt đối, nhỏ hơn hẳn 1 và lớn hơn hay bằng 0.1 (Vì vậy có tên biểu diễn theo dấu chấm động – floating point representation). Khi đó số lượng chữ số có trong phần đònh trò quyết đònh độ chính xác còn số lượng chữ số có trong phần mũ quyết đònh phạm vi biểu diễn số.Trong hệ đếm nhò phân ta cũng có cách biểu diễn hoàn toàn tương tự:Số nhò phân: (1011.0101bin) x 27 có thể viết lại thành (0.10110101bin) x 211. Phần đònh trò là 0.10110101bin và phần mũ là 1011binVì vậy có thể chọn cách biểu diễn bên trong máy tính như sau:Phần đònh trò Phần mũ9 bit 7 bitDấu chấm nhò phân giả đònhBit dấu của phần đònh trò Bit dấu của phần mũ(Biểu diễn của số thực: 0.10110101 E +001011 Số 0 đầu tiên của phần đònh trò không cần phải được biểu diễn trong thanh ghi)Với cách hiện thực này, cũng dùng thanh ghi 16 bit, số thực dương lớn nhất và nhỏ nhất có thể biểu diễn được là:0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 155 (Maximum) 0.1111 1111 E 0 111111 = (1 –2-8)x(2126−)dec ≈ 263dec(Minimum) 0.1000 0000 E 1 111111 = (2-1)x(2 - (126−))dec ≈ 2-64decĐộ chính xác và phạm vi biểu diễn số thực đã tăng lên rất nhiều so với cách biểu diễn theo dấu chấm tónh1. Dó nhiên cái giá phải trả ở đây là sự phức tạp về tính toán sẽ tăng lên so với biểu diễn bằng dấu chấm tónh Các phép toán số học với kiểu biểu diễn bằng dấu chấm động: Phép cộng: Để thực hiện được phép cộng hai số thực biểu diễn theo dấu chấm động trước tiên cần làm cho phần mũ của hai số giống nhau. Ví dụ:Cộng x = 0.111010010E0101010 với y = 0.110101101E0100101Hiệu hai phần mũ của x và y là:101010 – 100101 = 000101 = 5dec. Vậy x > y. Ta cần hiệu chỉnh y bằng cách dồn phần đònh trò của y 5 bước về bên phải (shift right) và tăng phần mũ của y cho khớp với phần mũ của x.x = 0.1 1 1 0 1 0 0 1 0 E 0101010y = 0.0 0 0 0 0 1 1 0 1 E 0101010x+y = 0.1 1 1 0 1 1 1 1 1 E 0101010Ví dụ:x = 0.1 1 0 1 1 0 1 1 1 E 0110110y = 0.1 1 1 0 1 1 0 1 1 E 0110110x+y = 1.1 1 0 0 1 0 0 1 0 E 0110110 = 0.1 1 1 0 0 1 0 0 1 E 0110111Kết quả ở dòng thứ ba có phần đònh trò lớn hơn 1 nên cần phải chuẩn hoá để được dạng biểu diễn đúng như trong dòng thứ tư.Phép trừ: Phép trừ được thực hiện bằng cách sử dụng số bù 2Ví dụ:x = 0.101010101E0001010y = 0.100010110E0000110. Tìm x-y ?Vì 0001010 – 0000110 = 0000100 (= 4dec) nên x > y. Ta cần hiệu chỉnh y trước khi cộng x với phần bù 2 của y. y = 0.100010110E0000110 = 0.000010001E00010101 Các thảo luận đầy đủ hơn về biểu diễn số thực theo kiểu dấu chấm động cũng như tiêu chuẩn công nghiệp IEEE 754 về dấu chấm động có thể tìm đọc trong:Cấu trúc máy tính nâng cao – VN-GUIDE – NXB Thống kê - 200156 Phần bù 2 của y là: (-y) = 0.111101111E0001010 x = 0.101010101E0001010 +(-y) = 0.111101111E0001010Kết quả: x-y = 1.101000100E0001010 = 0.110100010E0001011Phép nhân: Thực hiện phép nhân bằng cách nhân hai phần đònh trò và cộng hai số mũ. Sau khi thực hiện xong thì chuẩn hoá phần đònh trò và điều chỉnh số mũ.Ví dụ:x = 0.110101010E0010110y = 0.110000000E0000101x x y = 0.100111111E0011011Ví dụ:x = 0.101011001E01101101y = 0.101000000E01111100x x y = 0.110101111 E11101001 (Tràn số)(Kết quả cuối cùng bò sai vì vượt quá giới hạn biểu diễn của phần mũ)Phép chia: Thực hiện bằng cách chia phần đònh trò của x cho y. Trừ phần đònh trò của x cho yVí dụ:x = 0.100110101E0110010y = 0.110011100E0100010(x/y) = 0.110000000E001000057 . này, ta có:101110bin =1 .25 + 0 .24 + 1 . 23 + 1 .22 + 1 .21 + 0 .20 dec = ( 32 + 0+8+4 +2+ 0)dec=46dec.Khác với biểu diễn số nguyên trong toán học, trong máy tính. mở rộng độ dài thanh ghi. Chẳng hạn, vì 21 5 –1 = 32 7 67 < 600 32 < 21 6 –1 = 65 535 nên muốn biểu diễn số 60 032 dec ít nhất chiều dài của thanh ghi phải

Ngày đăng: 13/11/2012, 16:17

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan