Mục lục bài họcĐang ở d09-b1
← A-Level Computer Science
0/30 bài đã học xong
Chương 9 · Floating Point, Compression and Software Development · Bài 1/3 của chương · bài 25/30 của A-Level Computer Science

Floating point representation

Biểu diễn số dấu phẩy động
← Mục lục bài học
Lý thuyết · English

Why fixed point is not enough

A fixed point number puts the binary point in a set position, so the range and the precision are both fixed. Floating point splits the number into a mantissa (the significant digits) and an exponent (how far to move the point), which lets the same number of bits cover a far wider range.

$\text{Giá trị}=\text{định trị}\times2^{\text{số mũ}}$

Both parts are two's complement

The mantissa and the exponent are each held in two's complement, so both can be negative. The binary point sits immediately after the first bit of the mantissa, which is the sign bit.

Normalisation — the rule to memorise

A normalised number has its first two mantissa bits different: a positive number starts $0.1\ldots$ and a negative number starts $1.0\ldots$

Two reasons it is required. First, without it the same value has many representations ($0.1100\times2^3$ and $0.0110\times2^4$ are the same number), so comparison becomes unreliable. Second, unnormalised numbers waste leading bits that carry no information, which loses precision.

The trade-off inside a fixed word length

Give more bits to the mantissa and you gain precision but lose range; give more to the exponent and the reverse happens. That trade-off is a favourite exam question, and the answer is always that the total is fixed so one gains at the other's expense.

Errors

Overflow: the number is too large for the exponent field. Underflow: too small, so it rounds towards zero. Rounding error: many decimal fractions such as $0{,}1$ have no exact binary representation, so a stored value differs slightly from the intended one. That is why financial software does not test two floating point values for exact equality.

Giải thích tiếng Việt

Vì sao dấu phẩy tĩnh không đủ

Số dấu phẩy tĩnh đặt dấu phẩy nhị phân ở một vị trí cố định, nên cả phạm vi lẫn độ chính xác đều cố định. Dấu phẩy động tách số thành phần định trị (các chữ số có nghĩa) và số mũ (dịch dấu phẩy đi bao xa), nhờ đó cùng một số bit phủ được phạm vi rộng hơn rất nhiều.

$\text{Giá trị}=\text{định trị}\times2^{\text{số mũ}}$

Cả hai phần đều là bù hai

Phần định trị và số mũ đều được lưu ở dạng bù hai, nên cả hai đều có thể âm. Dấu phẩy nhị phân nằm ngay sau bit đầu tiên của phần định trị, và bit đó chính là bit dấu.

Chuẩn hoá — quy tắc phải thuộc

Một số đã chuẩn hoá có hai bit đầu của phần định trị KHÁC NHAU: số dương bắt đầu bằng $0.1\ldots$ và số âm bắt đầu bằng $1.0\ldots$

Hai lý do bắt buộc phải chuẩn hoá. Thứ nhất, không chuẩn hoá thì cùng một giá trị có nhiều cách viết ($0.1100\times2^3$ và $0.0110\times2^4$ là cùng một số), nên việc so sánh trở nên không đáng tin. Thứ hai, số chưa chuẩn hoá lãng phí các bit đầu vốn không mang thông tin gì, và điều đó làm mất độ chính xác.

Đánh đổi bên trong một độ dài từ cố định

Dành nhiều bit hơn cho phần định trị thì được độ chính xác nhưng mất phạm vi; dành nhiều hơn cho số mũ thì ngược lại. Sự đánh đổi này là câu hỏi ưa thích của đề thi, và câu trả lời luôn là: tổng số bit cố định nên bên này được thì bên kia mất.

Các loại lỗi

Tràn trên: số quá lớn so với trường số mũ. Tràn dưới: số quá nhỏ nên bị làm tròn về $0$. Sai số làm tròn: nhiều phân số thập phân như $0{,}1$ không có biểu diễn nhị phân chính xác, nên giá trị lưu được lệch nhẹ so với giá trị mong muốn. Đó là lý do phần mềm tài chính không so sánh hai số dấu phẩy động bằng phép bằng nhau tuyệt đối.

So dau phay dong — chuan hoa la bat buoc011000000011PHAN DINH TRI (8 bit)SO MU (4 bit)0.1100000 = 0,750011 = 3Gia tri = 0,75 x 2^3 = 6CHUAN HOA: hai bit dau cua dinh tri phai KHAC NHAUso duong bat dau 01… · so am bat dau 10…Khong chuan hoa thi mot so co nhieu cach viet va mat do chinh xac
Nhớ một câu là đủ cho phần lớn câu hỏi chuẩn hoá: hai bit đầu của phần định trị phải khác nhau — dương thì $01$, âm thì $10$.
Ví dụ — chuyển đổi và chuẩn hoá

Một hệ dùng $8$ bit định trị và $4$ bit số mũ, cả hai ở dạng bù hai.

(a) Tính giá trị thập phân của 0101 0000 0010.
(b) Biểu diễn $-2{,}5$ ở dạng đã chuẩn hoá.
(c) Số 0001 1000 0100 đã chuẩn hoá chưa? Nếu chưa, hãy chuẩn hoá.

Giải.

(a) Định trị $=0.1010000$; dấu phẩy nằm ngay sau bit đầu.

Bit đầu là $0$ nên đây là số dương. Giá trị định trị $=\frac12+\frac18=0{,}5+0{,}125=0{,}625$.

Số mũ $=0010=2$.

Giá trị $=0{,}625\times2^2=0{,}625\times4=\mathbf{2{,}5}$

(b) Biểu diễn $-2{,}5$.

Bước 1: viết $2{,}5$ ở nhị phân là $10{,}1$.

Bước 2: chuẩn hoá cho số DƯƠNG trước — dịch dấu phẩy sang trái $2$ vị trí: $0{,}101\times2^2$, tức định trị $01010000$ và số mũ $0010$. (Đây đúng là kết quả phần a.)

Bước 3: lấy bù hai của phần ĐỊNH TRỊ để ra số âm. Đảo bit $01010000$ thành $10101111$, cộng $1$ được $10110000$. Số mũ giữ nguyên $0010$.

Kết quả: 1011 0000 0010

Kiểm chuẩn hoá: hai bit đầu là $1$ và $0$ — khác nhau ✓, đúng dạng số âm đã chuẩn hoá.

Chú ý: chỉ lấy bù hai của định trị, KHÔNG đụng tới số mũ. Lấy bù hai cả hai phần là lỗi rất hay gặp.

(c) Định trị $=0001 1000$, tức $0.0011000$. Hai bit đầu là $0$ và $0$ — giống nhau, nên CHƯA chuẩn hoá.

Dịch dấu phẩy sang trái $2$ vị trí để bit thứ hai thành $1$: định trị thành $01100000$. Mỗi lần dịch trái một vị trí thì số mũ phải GIẢM $1$ để giá trị không đổi, nên số mũ $=4-2=2$, tức $0010$.

Kết quả chuẩn hoá: 0110 0000 0010

Kiểm giá trị không đổi: ban đầu $0{,}1875\times2^4=3$; sau khi chuẩn hoá $0{,}75\times2^2=3$ ✓. Đây là phép kiểm bắt buộc — chuẩn hoá chỉ đổi CÁCH VIẾT, không đổi giá trị.

Bẫy hay mất điểm — Dịch định trị sang trái mà tăng số mũ (hoặc dịch phải mà giảm). Dịch TRÁI làm định trị lớn lên nên số mũ phải GIẢM để bù lại. Cách kiểm chắc chắn: tính giá trị thập phân trước và sau — nếu khác nhau thì đã sai dấu.
Phải nhớ — Giá trị $=$ định trị $\times2^{\text{số mũ}}$, cả hai phần đều bù hai. Chuẩn hoá là hai bit đầu định trị khác nhau. Nhiều bit định trị hơn thì chính xác hơn nhưng phạm vi hẹp hơn. Và luôn kiểm lại bằng giá trị thập phân.

Đọc xong rồi — làm thử ngay

Bài tập của chương Floating Point, Compression and Software Development gồm 14 câu trắc nghiệm và 3 đề tự luận. Đáp án hiện ngay khi chọn, miễn phí.

Làm bài tập chương →