Bài giảng Kiến trúc máy tính và hợp ngữ - Bài 03: Số chấm động
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kiến trúc máy tính và hợp ngữ - Bài 03: 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:
- bai_giang_kien_truc_may_tinh_va_hop_ngu_bai_03_so_cham_dong.pdf
Nội dung text: Bài giảng Kiến trúc máy tính và hợp ngữ - Bài 03: Số chấm động
- 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 -9 –0.00000000110 (1.010 x 10 ) •Biểu diễn số thập phân 1.5 ? 2
- Biểu diễn phần thập phân -i •Biểu diễn số 5.375 thế nào ? i 2 Cần bao nhiêu bit ? 01.0 1 10.5 1/2 •Giả sử dùng 8 bit để lưu trữ phần 20.25 1/4 nguyên 30.125 1/8 5= 4 +1= 00000101 40.06251/16 50.031251/32 •Tương tự có thể dùng 8 bit lưu trữ 60.015625 phần thập phân 70.0078125 0.375 = 0.25 + 0.125 = 01100000 80.00390625 •Vậy có thể biểu diễn 90.001953125 100.0009765625 5.375 = 00000101.01100000 110.00048828125 120.000244140625 •Tổng quát ta có: n i130.0001220703125 xn-1KKx1x0.2x-12x xxmi= å 140.00006103515625 im=- 150.000030517578125 => Biểu diển số chấm tĩnh (fixed point) 3
- 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 S Exponent Significand 1 bit m bits n bits –Sign (S): phần dấu –Exponent (E): phần số mũ –Significand (S):phần định trị •Giá trị ±S×2E 6
- Biểu diễn khoa học •Giá trị 1 / 1,000,000,000 có thể biểu diễn như sau: -9 –1.010 × 10 à Dạng chuẩn (Normalized form) -8 -10 –0.110 × 10 , 10.010 × 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 decimal point 23 6.0210 x 10 mantissa radix (base) exponent -1 1.02 x 2 “binary point” 7
- Chuẩn số chấm động IEEE 754 •Biểu diễn số chấm động Single Precision (32 bit) 31 30 2322 0 S Exponent Significand 1 bit 8 bits 23 bits –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 yyy y •Dạng chuẩn: +/-1.xxx x2×2 2 •Ví dụ: Biểu diễn: 0 10000001 01011000000000000000000 Có giá trị: +1.0101100 00×210000001 ~ +(1+2-2 + 2-4 + 2-5) ×22 = 5.375 8
- Chuyển từ biểu diễn nhị phân sang thập phân 0 0110 1000 101 0101 0100 0011 0100 0010 •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) 9
- 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 1 1000 0011 011 1011 0100 0000 0000 0000 10
- 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 0 0111 1101 0101 0101 0101 0101 0101 010 11
- 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 + (+¥) 11.(+¥) + (–¥) 21. 2. X –(+¥) 12.(–¥) + (+¥) 3. X + (–¥) 13.(+¥) –(+¥) 4. X –(–¥) 14.(–¥) –(–¥) 5. X × (+¥) 15.¥ × 0 6. X / (–¥) 16.¥ /0 7. (+¥) + (+¥) 17.X/0 8. (–¥) + (–¥) 18.0/0 9. (–¥) –(+¥) 19.¥ / ¥ 10.(+¥) –(–¥) 20.sqrt(X),X<0 13
- Phân bố, phạm vi biểu diễn •Phạm vi biểu diễn. Chứng minh ? •Phân bố 14
- 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) 15
- Số dạng không chuẩn •Số dương nhỏ nhất có thể biểu diễn -126 -126 a = 1.0 2 × 2 = 2 Gaps! - + 0 a 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 -126 -23 -126 -149 •a = 0.00 12 × 2 = 2 × 2 = 2 - + 0 16
- 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 en.wikipedia.org/wiki/Floating_point 17
- Biểu diễn số chấm động 8 bit 18
- Bảng tóm tắt số chấm động 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 0 0<e<255 f 2e-127 (1.f) 0 0<e<2047 f 2e-1023 (1.f) (dạng chuẩn) Số âm 1 0<e<255 f -2e-127 (1.f) 1 0<e<2047 f -2e-1023 (1.f) (dạng chuẩn) Số dương 0 0 f ¹ 0 2e-126 (0.f) 0 0 f ¹ 0 2e-1022 (0.f) (dạng không chuẩn) Số âm (dạng 1 0 f ¹ 0 -2e-126 (0.f) 1 0 f ¹ 0 -2e-1022 (0.f) không chuẩn) 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.00 00×21) –(1.11 11×20) 1.00 .00 ×21 1.00 .00 00 ×21 -0.111 .1 ×21 (= 1.11 .11×20) -0.111 .1 10 ×21 (= 1.11 .11×20) 0.000 01 ×21 0.000 00 10 ×21 =1.00 00 ×2-22 =1.00 00 00 ×2-23 21
- 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: 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”); } 23
- 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