1
HỆ THỐNG MÁY TÍNH
03 – Biểu diễn số thực
t vn
2
ă
Biu din 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
Ô
Vi phn nguyờn: Dựng 8 bit ([010, 25510])
12310 = 64 + 32 + 16 + 8 + 2 + 1 = 0111 10112
Ô
Vi phn thp phõn: Tng t dùng 8 bit
0.375 = 0.25 + 0.125 = 2-2 + 2-3 = 0110 00002
123.37510 = 0111 1011.0110 00002
ă
Tng quỏt cụng thức khai triển của số thập phân hệ nhị phân:
xn -1 xn - 2 ... x0 .x-1 x- 2 ... x- m = xn -1.2 n -1 + xn - 2 .2 n - 2... + x0 .20 + x-1.2 -1 + x- 2 .2 -2 + ... + x- m 2 - m
t vn
3
ă
Tuy nhiờnvi 8 bit:
Ô
Phn nguyờn ln nht cú th biu din: 255
Ô
Phn thp phõn nh nht 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 phn thp phõn
Ô
Vi 16 bit cho phn thp phõn: min = 2-16 ~ 10-5
Ô
Cú v khụng hiu quCỏch tt hơn ?
Floating Point Number (Số thực dấu chấm động)
Floating Point Number ?
4
ă
Gi s ta cú s ( dng nhị phân)
X = 0.00000000000000112 = (2-15 + 2-16)10
14 số 0
à
X = 0.112 * (2-14)10 (= (2-1 + 2-2).2-14 = 2-15 + 2-16)
à
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)
Chun húa s thp phõn
5
ă
Trc khi cỏc s c biu diễn dưới dạng số chấm
động, chúng cần được chuẩn hóa v dng: 1.F * 2E
ă
Ô
F: Phn thp phõn khụng du (nh tr - Significant)
Ô
E: Phn s m (Exponent)
Vớ d:
Ô
+0.0937510 = 0.000112 = +1.1 * 2-4
Ô
-5.2510
= 101.012 = -1.0101 * 22
Biu din s chm ng
6
ă
Cú nhiu chun nhng hin 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)
Biu din s chm ng
7
ă
S chm ng chớnh xỏc n (32 bits):
Sign
Exponent (biased)
1 bit
ă
Significand
8 bits
23 bits
S chm ng chớnh xỏc kộp (64 bits):
Sign
Exponent (biased)
1 bit
Significand
11 bits
52 bits
ă
Sign: Bit du (1: S õm, 0: S dng)
ă
Exponent: S m (Biu din di dng s quỏ K (Biased) vi
ă
Ô
Chớnh xỏc n: K = 127 (2n-1 - 1 = 28-1 - 1) với n l s bit lu 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)
Vớ d
8
ă
Biu din s thc sau theo dng s chm ng chớnh xỏc n (32 bit): X = -5.25
ă
Bc 1: i X sang h nh phõn
X = -5.2510 = -101.012
ă
Bc 2: Chuẩn hóa theo dạng ±1.F * 2E
X = -5.25 = -101.01 = -1.0101 * 22
ă
Bc 3: Biu din Floating Point
Ô
S õm: bit du 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
Ô
Phn 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
Tho lun v exponent
9
ă
Vỡ sao phn s m exponent khụng giữ nguyên lại phải lưu trữ
dưới dạng số quá K (Dng biased)?
ă
Gi s trong s chm 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 chọn
số K = 128 để miền giá trị gốc là [-128, 127] như bình
thường?
Cõu hi 1 - ỏp ỏn
10
ă
S d Exponent c lu 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 tốn
Cõu hi 2 - ỏp ỏn
11
ă
S K c chn 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 chun húa thnh dng 1.F * 2E
ă
Tc l chỳng ta sẽ ln ln để 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
Vy thỡ
12
ă
Khi mun biu din 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ề dng 1.F * 2E ?
ă
Vi s dng 0.F * 2-127 thỡ chun húa c na khụng?
ă
Vi 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 ?
Tr li
13
ă
Vỡ ú l nhng s thc c bit, ta không thể
biểu diễn bằng dấu chấm động J
S thc c bit
14
ă
S 0 (zero)
Ô
ă
S khụng th chun húa (denormalized)
Ô
ă
Exponent = 0, Significand != 0
S vụ cựng (infinity)
Ô
ă
Exponent = 0, Significand = 0
Exponent = 111…1 (toàn bit 1), Significand = 0
S bỏo li (NaN Not a Number)
Ô
Exponent = 111…1 (toàn bit 1), Significand != 0
Normalized number
15
ă
ă
ă
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)
Denormalized number
16
ă
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
ă
Tng t cho số negative (số âm)
Ví dụ: n = 4, m = 3, bias = 7
17
Phân bố các số thực (32 bits)
18
Chuẩn IEEE 754
19
Bi tp 1
20
ă
Biu din s thc sau theo dng s chm ng chớnh xỏc n (32 bit): X = +12.625
ă
Bc 1: Đổi X sang hệ nhị phân
X = -12.62510 = -1100.1012
ă
Bc 2: Chun húa theo dng 1.F * 2E
X = -12.62510 = -1100.1012 = -1.100101 * 23
ă
Bc 3: Biu din Floating Point
Ô
S dng: bit du 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
Ô
Phn 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