Kiến trúc máy tính và hợp ngữ - Bài 03: Số chấm động

Khi thực hiện các phép toán trên số chấm động, kết quả nhận được có thể vượt ra ngoài khả năng biểu diễn của phần định trị. • Phần cứng phục vụ các phép toán trên số chấm động thường có thêm 2 bit nhớ hỗ trợ cho phần định trị giúp thực hiện việc làm tròn để có được kết quả chính xác nhất có thể.

pdf27 trang | Chia sẻ: huyhoang44 | Lượt xem: 925 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Kiến trúc máy tính và hợp ngữ - Bài 03: Số chấm động, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài 03: Số chấm động Phạm Tuấn Sơn ptson@fit.hcmus.edu.vn Vấn đề với biểu diễn số nguyên • Số nguyên N bit biểu diễn được 2N giá trị – Biểu diễn không dấu (Unsigned Integer) 0 à 2N – 1 (N=32, 2N–1 = 4,294,967,295) – Biểu diễn bù 2 -2(N-1) à 2(N-1) – 1 (N=32, 2(N-1) = 2,147,483,648) • Biểu diễn số rất lớn ? Số giây / 1 nghìn năm – 31,556,926,000 (3.1556926 x 1010) • Biểu diển số rất nhỏ ? Số giây / 1 nano giây – 0.00000000110 (1.010 x 10-9) • Biểu diễn số thập phân 1.5 ? 2 Biểu diễn phần thập phân • Biểu diễn số 5.375 thế nào ? Cần bao nhiêu bit ? • Giả sử dùng 8 bit để lưu trữ phần nguyên 5 = 4 + 1 = 00000101 • Tương tự có thể dùng 8 bit lưu trữ phần thập phân 0.375 = 0.25 + 0.125 = 01100000 • Vậy có thể biểu diễn 5.375 = 00000101.01100000 • Tổng quát ta có: => Biểu diển số chấm tĩnh (fixed point) 3 0 1.0 1 1 0.5 1/2 2 0.25 1/4 3 0.125 1/8 4 0.0625 1/16 5 0.03125 1/32 6 0.015625 ... 7 0.0078125 8 0.00390625 9 0.001953125 10 0.0009765625 11 0.00048828125 12 0.000244140625 13 0.0001220703125 14 0.00006103515625 15 0.000030517578125 i 2-i 1 1 0 1 2. 2 n i n m i i m x x x x x x x- - - - =- = åK K Giới hạn biểu diễn số chấm tĩnh • Với 8 bit – Phần nguyên lớn nhất có thể biểu diễn là 28 - 1= 255 – Phần thập phân nhỏ nhất có thể biểu diễn là 2-8 = 1/256 = 0.00390625 ~ 10-3 • Nếu muốn tính toán với số nhỏ hơn như 0.000110 hay 0.0000110 ? à Tăng số bit Với 16 bit phần thập phân min = 1/65536 = 0.0000152587890625 ~ 10-5 • Có cách nào tốt hơn ? 4 Số chấm động – Ý tưởng • Hệ thập phân – 123000000000 ~ 1.23×1011 và 0.0000000000123 ~ 1.23×10-11 • Tương tự với hệ nhị phân, ta có x = 00000101.01100000 = 22 + 20 + 2-2 + 2-3 • Ta có thể viết lại x = 1.01011 × 22 • Thay vì dùng 16 bit để lưu trữ, chỉ cần dùng 7 bit (5 bit phần trị + 2 bit phần mũ) x = 1.01011 10 • Như vậy, – Muốn tiết kiệm số bit lưu trữ, ta đã di chuyển vị trí của dấu chấm sang phải 14 vị trí – Cần lưu: phần trị, phần mũ và phần dấu => Đây là ý tưởng cơ bản của số chấm động (floating point) 5 Biểu diễn số chấm động • Biểu diễn số chấm động – Sign (S): phần dấu – Exponent (E): phần số mũ – Significand (S): phần định trị • Giá trị ±S×2E 6 S Exponent Significand 1 bit m bits n bits Biểu diễn khoa học • Giá trị 1 / 1,000,000,000 có thể biểu diễn như sau: – 1.010 × 10-9à Dạng chuẩn (Normalized form) – 0.110 × 10-8, 10.010 × 10-10à Dạng không chuẩn (Denormalized form) • Dạng chuẩn: phần nguyên gồm 1 chữ số khác 0 7 6.0210 x 1023 radix (base) decimal point mantissa exponent 1.02 x 2-1 “binary point” Chuẩn số chấm động IEEE 754 • Biểu diễn số chấm động Single Precision (32 bit) – S: dấu (Sign) – 0: dương, 1: âm – Exponent: phần số mũ (lưu dưới dạng số biased) – Significand: phần định trị • Ngầm định bắt đầu là 1 + phần trị ~ (1 + 23) bits • Dạng chuẩn: +/-1.xxxx2×2yyyy2 • Ví dụ: Biểu diễn: 0 10000001 01011000000000000000000 Có giá trị: +1.010110000×210000001 ~ +(1+2-2 + 2-4 + 2-5) ×22 = 5.375 8 031 S Exponent 30 23 22 Significand 1 bit 8 bits 23 bits Chuyển từ biểu diễn nhị phân sang thập phân 9 • Dấu: 0 à dương • Mũ: – 0110 1000 có giá trị (dạng biased) là 104 - 127 = -23 • Trị: 1 + 1x2-1+ 0x2-2 + 1x2-3 + 0x2-4 + 1x2-5 +... =1+2-1+2-3 +2-5 +2-7 +2-9 +2-14 +2-15 +2-17 +2-22 = 1.0 + 0.666115 • Kết quả: 1.666115×2-23 ~ 1.986×10-7 (~ 2/10,000,000) 0 0110 1000 101 0101 0100 0011 0100 0010 Chuyển từ biểu diễn thập phân sang nhị phân -2.340625 x 101 1. Không chuẩn hóa: -23.40625 2. Chuyển phần nguyên: 23 = 16 + 4 + 2 + 1 = 10111 3. Chuyển phần thập phân: .40625 = .25 + .125 + .03125 = .01101 4. Kết hợp và chuẩn hóa: 10111.01101 = 1.011101101 x 24 5. Chuyển phần mũ: 127 + 4 = 10000011 10 1 1000 0011 011 1011 0100 0000 0000 0000 Chuyển từ biểu diễn thập phân sang nhị phân (tt) • 1/3 = 0.33333 = 0.25 + 0.0625 + 0.015625 + 0.00390625 + = 1/4 + 1/16 + 1/64 + 1/256 + = 2-2 + 2-4 + 2-6 + 2-8 + = 0.0101010101 * 20 = 1.0101010101 * 2-2 – Dấu: 0 – Mũ = -2 + 127 = 125 = 01111101 – Trị = 0101010101 11 0 0111 1101 0101 0101 0101 0101 0101 010 Các số đặc biệt • Phần mũ = 0, phần trị = 0 – Số zero • Phần mũ = 0, phần trị ¹ 0 – Số dạng không chuẩn (denormalized) • Phần mũ toàn bit 1, phần trị = 0 – Số vô cùng (infinity) • Phần mũ toàn bit 1, phần trị ¹ 0 – Số báo lỗi (NaN - Not a Number) • Signaling NaN • Quiet NaN 12 Những trường hợp tạo số đặc biệt 1. X + (+¥) 2. X – (+¥) 3. X + (–¥) 4. X – (–¥) 5. X × (+¥) 6. X / (–¥) 7. (+¥) + (+¥) 8. (–¥) + (–¥) 9. (–¥) – (+¥) 10.(+¥) – (–¥) 13 11.(+¥) + (–¥) 12.(–¥) + (+¥) 13.(+¥) – (+¥) 14.(–¥) – (–¥) 15.¥ × 0 16.¥ / 0 17.X / 0 18.0 / 0 19.¥ / ¥ 20.sqrt(X), X<0 21... Phân bố, phạm vi biểu diễn • Phân bố 14 • Phạm vi biểu diễn. Chứng minh ? Phân bố • Đặt f(1,2) = số lượng số chấm động trong khoảng 1 và 2 • Đặt f(2,3) = số lượng số chấm động trong khoảng 2 và 3 • Hỏi 1. f(1,2) < f(2,3) 2. f(1,2) = f(2,3) 3. f(1,2) > f(2,3) 15 Số dạng không chuẩn • Số dương nhỏ nhất có thể biểu diễn a = 1.0 2 × 2-126 = 2-126 Lý do: ngầm định 1 + phần trị • Giải pháp: – Qui ước nếu số mũ = 0 (phần trị ¹ 0), không ngầm định bắt đầu là 1 à Số dạng không chuẩn (denormalized) – Số dương nhỏ nhất có thể biểu diễn • a = 0.0012 × 2-126 = 2-23 × 2-126 = 2-149 16 a0 +- Gaps! 0 +- Một số loại chấm động • Single Precision (32 bit) – 1/8/23 (kiểu float trong C), 10-38à 1038 • Double Precision (64 bit) – 1/11/52 (kiểu double trong C), 10-308à 10308 • Half Precision (16 bit) – 1/5/10 • Quad Precision (8 bit) – 1/4/3 • IEEE 754-2008 “binary128” (128 bit) – 1/15/112 17 en.wikipedia.org/wiki/Floating_point Biểu diễn số chấm động 8 bit 18 Single Precision (32 bit) Double Precision (64 bit) Dấu Mũ Trị Giá trị Dấu Mũ Trị Giá trị +0 0 0 0 0 0 0 0 0 – 0 1 0 0 -0 1 0 0 -0 +¥ 0 255 (toàn bit 1) 0 ¥ 0 2047 (toàn bit 1) 0 ¥ – ¥ 1 255 (toàn bit 1) 0 -¥ 1 2047 (toàn bit 1) 0 -¥ Quiet NaN 0/ 1 255 (toàn bit 1) ¹ 0 NaN 0/ 1 2047 (toàn bit 1) ¹ 0 NaN Signaling NaN 0/ 1 255 (toàn bit 1) ¹ 0 NaN 0/ 1 2047 (toàn bit 1) ¹ 0 NaN Số dương (dạng chuẩn) 0 0<e<255 f 2e-127 (1.f) 0 0<e<2047 f 2e-1023 (1.f) Số âm (dạng chuẩn) 1 0<e<255 f -2e-127 (1.f) 1 0<e<2047 f -2e-1023 (1.f) Số dương (dạng không chuẩn) 0 0 f ¹ 0 2e-126 (0.f) 0 0 f ¹ 0 2e-1022 (0.f) Số âm (dạng không chuẩn) 1 0 f ¹ 0 -2e-126 (0.f) 1 0 f ¹ 0 -2e-1022 (0.f) Bảng tóm tắt số chấm động 19 Khái niệm Precision và Accuracy • Precision: số bit được sử dụng trong máy tính để biểu diễn 1 giá trị. • Accuracy: độ chính xác mà một kiểu biểu diễn trong máy tính có thể biểu diễn được một giá trị. • Thường thì precision cao sẽ dẫn tới accuracy cao. • Ví dụ: float pi = 3.14; – pi được biểu diễn bởi 24 bit phần trị (precise cao), nhưng chỉ có thể biểu diễn được gần đúng pi (không accuracy). 20 Làm tròn (Rounding) • Khi thực hiện các phép toán trên số chấm động, kết quả nhận được có thể vượt ra ngoài khả năng biểu diễn của phần định trị. • Phần cứng phục vụ các phép toán trên số chấm động thường có thêm 2 bit nhớ hỗ trợ cho phần định trị giúp thực hiện việc làm tròn để có được kết quả chính xác nhất có thể. • Ví dụ: thực hiện (1.0000×21) – (1.1111×20) 21 1.00.00 ×21 - 0.111.1 ×21 (= 1.11.11×20) 0.000..01 ×21 =1.0000 ×2-22 1.00.00 00 ×21 - 0.111.1 10 ×21 (= 1.11.11×20) 0.000..00 10 ×21 =1.0000 00 ×2-23 Chuẩn IEEE làm tròn số chấm động • Làm tròn lên (Round up / Round towards +¥) 1.01 10 ® 1.10 , -1.01 10 ® -1.01 • Làm tròn xuống (Round down / Round towards –¥) 1.01 10 ® 1.01, -1.01 10 ® -1.10 • Làm tròn về 0 (Truncate / Round towards 0) – Bỏ giá trị 2 bit nhớ • Làm tròn về giá trị gần nhất (Round to nearest): – 1.01 01 ® 1.01 , -1.01 11 ® -1.10 – Trường hợp 2 bit nhớ là 10 (halfway) ? • Làm tròn về số chẵn gần nhất (mặc định), nghĩa là LSB của phần định trị luôn bằng 0 1.01 10 ® 1.10 , -1.10 11 ® -1.10 22 Các trường hợp làm tròn khác • Làm tròn cũng được thực hiện khi thực hiện chuyển đổi: – Chuyển đổi từ kiểu double precision thành single precision – Chuyển đổi từ số chấm động thành số nguyên và ngược lại – Ép kiểu từ số chấm động thành số nguyên và ngược lại • Hãy khảo sát các trường hợp sau: 23 1.Chuyển đổi float -> int -> float.Kết quả như ban đầu ? 2.Chuyển đổi int -> float -> int. Kết quả như ban đầu ? 3.Phép cộng số chấm động có tính kết hợp ? (x+y)+z = x+(y+z) 4.i = (int) (3.14159 * f); 5.f = f + (float) i; 6.if (i == (int)((float) i)) { printf(“true”); } 7.if (i == (int)((double) i)) { printf(“true”); } 8.if (f == (float)((int) f)) { printf(“true”); } 9.if (f == (double)((int) f)) { printf(“true”); } Phép cộng, trừ số chấm động 24 Phép nhân số chấm động 25 Phép chia số chấm động 26 Tham khảo • Chương 3, P&H • Chương 9, William Stallings 27

Các file đính kèm theo tài liệu này:

  • pdfch03_so_cham_dong_ptson_6124.pdf
Tài liệu liên quan