Kiến trúc máy tính và hợp ngữ - Biểu diễn số chấm động
Bạn đang xem 20 trang mẫu của tài liệu "Kiến trúc máy tính và hợp ngữ - Biểu diễn số chấm động", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- kien_truc_may_tinh_va_hop_ngu_bieu_dien_so_cham_dong.pdf
Nội dung text: Kiến trúc máy tính và hợp ngữ - Biểu diễn số chấm động
- 1 Môn học: Kiến trúc máy tính & Hợp ngữ
- • Biểu diễn số 123.37510 sang hệ nhị phân? • Ý tưởng đơn giản: Biểu diễn phần nguyên và phần thập phân riêng lẻ – Với phần nguyên: Dùng 8 bit ([010, 25510]) 12310 = 64 + 32 + 16 + 8 + 2 + 1 = 0111 10112 – Với phần thập phân: Tương tự dùng 8 bit -2 -3 0.375 = 0.25 + 0.125 = 2 + 2 = 0110 00002 123.37510 = 0111 1011.0110 00002 • Tổng quát công thức khai triển của số thập phân hệ nhị phân: n 1 n 2 0 1 2 m xn 1xn 2 x0.x 1x 2 x m xn 1.2 xn 2.2 x0.2 x 1.2 x 2.2 x m 2 2
- • Tuy nhiên với 8 bit: – Phần nguyên lớn nhất có thể biểu diễn: 255 – Phần thập phân nhỏ nhất có thể biểu diễn: 2-8 ~ 10-3 = 0.001 Biểu diễn số nhỏ như 0.0001 (10-4) hay 0.000001 (10- 5)? Một giải pháp: Tăng số bit phần thập phân – Với 16 bit cho phần thập phân: min = 2-16 ~ 10-5 – Có vẻ không hiệu quả Cách tốt hơn ? Floating Point Number (Số thực dấu chấm động) 3
- • Giả sử ta có số (ở dạng nhị phân) -15 -16 X = 0.00000000000000112 = (2 + 2 )10 14 số 0 -14 -1 -2 -14 -15 -16 X = 0.112 * (2 )10 (= (2 + 2 ).2 = 2 + 2 ) Thay vì dùng 16 bit để lưu trữ phần thập phân, ta có thể chỉ cần 6 bit: X = 0.11 1110 Cách làm: Di chuyển vị trí dấu chấm sang phải 14 vị trí, dùng 4 bit để lưu trữ số 14 này Đây là ý tưởng cơ bản của số thực dấu chấm động (floating point number) 4
- • Trước khi các số được biểu diễn dưới dạng số chấm động, chúng cần được chuẩn hóa về dạng: ±1.F * 2E – F: Phần thập phân không dấu (định trị - Significant) – E: Phần số mũ (Exponent) • Ví dụ: -4 – +0.0937510 = 0.000112 = +1.1 * 2 2 – -5.2510 = 101.012 = -1.0101 * 2 5
- • Có nhiều chuẩn nhưng hiện nay chuẩn IEEE 754 được dùng nhiều nhất để lưu trữ số thập phân theo dấu chấm động trong máy tính, gồm 2 dạng: (slide sau) 6
- • Số chấm động chính xác đơn (32 bits): Sign Exponent (biased) Significand 1 bit 8 bits 23 bits • Số chấm động chính xác kép (64 bits): Sign Exponent (biased) Significand 1 bit 11 bits 52 bits • Sign: Bit dấu (1: Số âm, 0: Số dương) • Exponent: Số mũ (Biểu diễn dưới dạng số quá K (Biased) với – Chính xác đơn: K = 127 (2n-1 - 1 = 28-1 - 1) với n là số bit lưu trữ Exponent – Chính xác kép: K = 1023 (2n-1 - 1 = 211-1 - 1) • Significand (Fraction): Phần định trị (phần lẻ sau dấu chấm) 7
- • Biểu diễn số thực sau theo dạng số chấm động chính xác đơn (32 bit): X = - 5.25 • Bước 1: Đổi X sang hệ nhị phân X = -5.2510 = -101.012 • Bước 2: Chuẩn hóa theo dạng ±1.F * 2E X = -5.25 = -101.01 = -1.0101 * 22 • Bước 3: Biểu diễn Floating Point – Số âm: bit dấu Sign = 1 – Số mũ E = 2 Phần mũ exponent với số thừa K=127 được biểu diễn: Exponent = E + 127 = 2 + 127 = 12910 = 1000 00012 – Phần định trị = 0101 0000 0000 0000 0000 000 (Thêm 19 số 0 cho đủ 23 bit) Kết quả nhận được: 1 1000 0001 0101 0000 0000 0000 0000 000 8
- • Vì sao phần số mũ exponent không giữ nguyên lại phải lưu trữ dưới dạng số quá K (Dạng biased)? • Giả sử trong số chấm động chính xác đơn (32 bits), ta dùng 8 bits để lưu giá trị exponent (biểu diễn dưới dạng số quá K), vậy miền giá trị của nó là [0, 255] Với K = 127, số mũ gốc ban đầu có miền giá trị [-127, 128] Miền giá trị này khá vô lý, vậy tại sao chúng ta không 9 chọn số K = 128 để miền giá trị gốc là [-128, 127] như
- • Sở dĩ Exponent được lưu trữ dưới dạng Biased vì ta muốn chuyển từ miền giá trị số có dấu sang số không dấu (vì trong biased, số k được chọn để sau khi cộng số bất kỳ trong miền giá trị gốc, kết quả là số luôn dương) Dễ dàng so sánh, tính toán 10
- • Số K được chọn là 127 mà không phải là 128 vì tại bước 2 trước khi biểu diễn thành số chấm động, chúng ta cần phải chuẩn hóa thành dạng ±1.F * 2E • Tức là chúng ta sẽ luôn luôn để dành 1 bit (số 1) phía trước dấu chấm chứ không đẩy sang trái hết Với 8 bit, số mũ gốc ban đầu không thể đạt mức nhỏ nhất là -128 mà chỉ là -127 Do vậy ta chỉ cần chọn K = 127 là được 11
- • Khi muốn biểu diễn số 0 thì ta không thể tìm ra bit trái nhất có giá trị = 1 để đẩy dấu chấm động, vậy làm sao chuẩn hóa về dạng ±1.F * 2E ? • Với số dạng ±0.F * 2-127 thì chuẩn hóa được nữa không? • Với K = 127, exponent lớn nhất sẽ là 255 Số mũ gốc ban đầu lớn nhất là 255 – 127 = +128 Vô lý vì với 8 bit có dấu ta không thể biểu diễn được số +128 ? 12
- • Vì đó là những số thực đặc biệt, ta không thể biểu diễn bằng dấu chấm động 13
- • Số 0 (zero) – Exponent = 0, Significand = 0 • Số không thể chuẩn hóa (denormalized) – Exponent = 0, Significand != 0 • Số vô cùng (infinity) – Exponent = 111 1 (toàn bit 1), Significand = 0 • Số báo lỗi (NaN – Not a Number) – Exponent = 111 1 (toàn bit 1), Significand != 014
- • Largest positive normalized number: +1.[23 số 1] * 2127 S Exp Significand (Fraction) - 0 1111 1110 1111 1111 1111 1111 1111 111 • Smallest positive normalized number: +1.[23 số 0] * 2-126 S Exp Significand (Fraction) - 0 0000 0001 0000 0000 0000 0000 0000 000 • Tương tự cho số negative (số âm) 15
- • Largest positive denormalized number: +0.[23 số 1] * 2-127 S Exp Significand (Fraction) - 0 0000 0000 1111 1111 1111 1111 1111 111 Tuy nhiên IEEE 754 quy định là +0.[23 số 1] * 2-126 vì muốn tiến gần hơn với “Smallest positive normalized number = +1.[23 số 0] * 2-126” • Smallest positive denormalized number: +1.[22 số 0]1 * 2-127 S Exp Significand (Fraction) - 0 0000 0000 0000 0000 0000 0000 0000 001 Tuy nhiên IEEE 754 quy định là +0.[22 số 0]1 * 2-126 • Tương tự cho số negative (số âm) 16
- • Biểu diễn số thực sau theo dạng số chấm động chính xác đơn (32 bit): X = +12.625 • Bước 1: Đổi X sang hệ nhị phân X = -12.62510 = -1100.1012 • Bước 2: Chuẩn hóa theo dạng ±1.F * 2E 3 X = -12.62510 = -1100.1012 = -1.100101 * 2 • Bước 3: Biểu diễn Floating Point – Số dương: bit dấu Sign = 0 – Số mũ E = 3 Phần mũ exponent với số thừa K=127 được biểu diễn: Exponent = E + 127 = 3 + 127 = 13010 = 1000 00102 – Phần định trị = 1001 0100 0000 0000 0000 000 (Thêm 17 số 0 cho đủ 23 bit) Kết quả nhận được: 0 1000 0010 1001 0100 0000 0000 0000 000 20
- • Biểu diễn số thực sau theo dạng số chấm động chính xác đơn (32 bit): X = - 3050 • Bước 1: Đổi X sang hệ nhị phân X = -305010 = -1011 1110 10102 • Bước 2: Chuẩn hóa theo dạng ±1.F * 2E 11 X = -305010 = - 1011 1110 10102 = -1.01111101010 * 2 • Bước 3: Biểu diễn Floating Point – Số âm: bit dấu Sign = 1 – Số mũ E = 11 Phần mũ exponent với số thừa K=127 được biểu diễn: Exponent = E + 127 = 11 + 127 = 13810 = 1000 10102 – Phần định trị = 0111 1101 0100 0000 0000 000 (Thêm 12 số 0 cho đủ 23 bit) Kết quả nhận được: 1 1000 1010 0111 1101 0100 0000 0000 000 21
- • Biểu diễn số thực sau theo dạng số chấm động chính xác đơn (32 bit): X = +1.1 * 2-128 • Lưu ý: – Số X: positive number – X < Smallest positive normalized number: +1.[23 số 0] * 2-126 số X là số không thể chuẩn hóa (denormalized number) Chuyển X về dạng: X = +0.011 * 2-126 • Bước 3: Biểu diễn Floating Point – Số dương: bit dấu Sign = 0 – Vì đây là số không thể chuẩn hóa Phần mũ exponent được biểu diễn: 0000 00002 – Phần định trị = 0110 0000 0000 0000 0000 000 Kết quả nhận được: 0 0000 0000 0110 0000 0000 0000 0000 000 22
- • Sách W.Stalling – Computer Arithmetic, đọc chương 9 • Đọc file 04_FloatingPoint.doc • Trả lời các câu hỏi: – Overflow, underflow? – Cộng trừ nhân chia trên số thực? – Quy tắc làm tròn? – NaN: nguyên tắc phát sinh? – Quiet NaN và Signaling NaN? 23