Mục lục bài họcĐang ở d09-b1
Floating point representation
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.
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.
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á.
(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ị.
Đọ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í.