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ể.
27 trang |
Chia sẻ: huyhoang44 | Lượt xem: 925 | Lượt tải: 0
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:
- ch03_so_cham_dong_ptson_6124.pdf