Dữ liệu: Float & IEEE 754 Deep Dive
Quảng cáo • Advertisement
📢 Sponsor Ad
Google AdSense
lesson.content.title
lesson.content.subtitle
🎯 Mục tiêu bài học
Tại sao 0.1 + 0.2 != 0.3? Tại sao game thủ FPS ghét số thực? Hãy mổ xẻ từng bit của số thực.
1. Cấu trúc IEEE 754 (32-bit Float)
Con người dùng số thập phân (Scientific Notation): $3.14 imes 10^0$ hoặc $-1.5 imes 10^{-3}$.
Máy tính dùng nhị phân: $V = (-1)^S imes (1.M) imes 2^{E-127}$.
32 bit được chia làm 3 phần:
- Bit 31 (S - Sign): 1 bit dấu. 0=Dương, 1=Âm.
- Bit 30-23 (E - Exponent): 8 bit số mũ. Được cộng thêm 127 (Bias) để biểu diễn số mũ âm mà không cần bit dấu phụ.
- Bit 22-0 (M - Mantissa/Fraction): 23 bit phần thập phân. (Luôn ngầm định có số 1 đứng trước: 1.xxxxx).
2. Lab 3: Tính tay số Float -> Binary
Đề bài: Chuyển số 13.625 sang IEEE 754.
Bước 1: Chuyển phần nguyên (13)
$13 = 1101_2$.
Bước 2: Chuyển phần thập phân (0.625)
Nhân liên tục với 2:
- $0.625 imes 2 = 1.25$ -> Lấy 1, còn 0.25.
- $0.25 imes 2 = 0.5$ -> Lấy 0, còn 0.5.
- $0.5 imes 2 = 1.0$ -> Lấy 1, hết.
Vậy $13.625 = 1101.101_2$.
Bước 3: Chuẩn hóa (Về dạng 1.xxxxx)
Dời dấu phẩy sang trái 3 nấc: $1.101101 imes 2^3$.
Bước 4: Xác định S, E, M
- S: Số dương ->
0. - E: Mũ thật là 3. Mũ lưu trữ = $3 + 127 = 130$.
$130 = 10000010_2$. - M: Lấy phần sau dấu phẩy: $101101$. Điền thêm số 0 cho đủ 23 bit:
10110100000000000000000.
Kết quả cuối cùng (Hex dump):
Gép lại: 0 10000010 10110100000000000000000.
Hex: 0x415A0000.
3. Các giá trị đặc biệt (Special Values)
| Trường hợp | Kết quả | Ý nghĩa |
|---|---|---|
| E=255, M=0 | Infinity (+/- Vô cực) | Khi chia cho 0 (1.0 / 0.0). |
| E=255, M!=0 | NaN (Not a Number) | Phép tính vô nghĩa (0/0, căn bậc 2 số âm). |
| E=0, M=0 | Zero (+0 hoặc -0) | Máy tính có 2 số 0! |
| E=0, M!=0 | Subnormal Numbers | Số cực bé (gần sát 0). |
🔥 Interview Q&A
Q1: Tại sao không nên dùng Float để tính tiền (Currency)?
A: Vì các số như 0.1 (1/10) là số vô hạn tuần hoàn trong nhị phân ($0.00011001100...$). Máy tính phải cắt bớt đuôi -> Gây sai số. Cộng dồn triệu giao dịch sẽ làm mất cả tỷ đồng. Hãy dùng số nguyên (Lưu Xu thay vì Đồng) hoặc thư viện Decimal.
Quảng cáo • Advertisement
📢 Ad Space
Google AdSense