Số thực (Floating-point numbers)
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| floating-point/ˈfləʊtɪŋ pɔɪnt/ | dấu phẩy động |
| mantissa/mænˈtɪsə/ | mantissa |
| exponent/ekˈspəʊnənt/ | số mũ |
| normalised/ˈnɔːməlaɪzd/ | chuẩn hóa |
| precision/prɪˈsɪʒn/ | độ chính xác |
| rounding errors/ˈraʊndɪŋ ˈerəz/ | sai số làm tròn |
| fixed-point/fɪkst pɔɪnt/ | điểm cố định |
| overflow/ˌəʊvəˈfləʊ/ | Vượt quá |
| underflow/ˌʌndəˈfləʊ/ | tràn dưới |
Một tên lửa bỏ sót 600 mét
- Ngày 25 tháng 2 năm 1991, hệ thống phòng không Patriot tại Dhahran đã không chặn được tên lửa đang lao tới. Hai mươi tám binh sĩ thiệt mạng.
- Hệ thống đếm thời gian theo phần mười giây, và 0.1 không có biểu diễn nhị phân chính xác: nó là phân số lặp lại, bị cắt cụt theo độ rộng thanh ghi. Mỗi nhịp đếm mất đi một phần nhỏ của microgiây.
- Sau một trăm giờ chạy, sai số tích lũy là một phần ba giây, và trong một phần ba giây thì mục tiêu di chuyển 600 mét. Phép tính đúng ở từng bước riêng lẻ.
- Bài học này là định dạng số thập phân nổi floating-point, chuẩn hóa normalisation, và các sai số xấp xỉ khiến những trường hợp như thế này có thể xảy ra.
Định dạng
- Để lưu trữ số thực có kích thước rất khác nhau, máy tính sử dụng dạng nhị phân của ký hiệu khoa học với hai trường: phầnmantissa, các chữ số có nghĩa, và số mũ exponent, lũy thừa của 2 để nhân lên. Cả hai đều được lưu dưới dạng bù hai two's complement.
- Đọc phần thập phân như một phân số nhị phân: bit đầu tiên sau dấu chấm có giá trị $\tfrac12$, bit tiếp theo $\tfrac14$, rồi $\tfrac18$. Vậy
0.1010000là $\tfrac12 + \tfrac18 = 0.625$. - Với số mũ
00000010, tức là $+2$, giá trị là $0.625 \times 2^2 = 2.5$.

Một phân số và lũy thừa của hai
Xây dựng số thực
Lật ngược các bit phần thập phân và mũ để tạo ra giá trị, và kiểm tra xem nó có được chuẩn hóa hay không.
Một số thực được lưu trữ dưới dạng:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
value = mantissa × 2^exponent — ký hiệu khoa học nhị phân, với cả hai phần được lưu trữ dưới dạng bù hai.
Gắn mỗi phần của biểu diễn số thực với vai trò của nó.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
value = mantissa × 2^exponent; chuẩn hóa tối đa hóa độ chính xác; tiền tệ sử dụng số cố định/BCD để tránh làm tròn.
Ví dụ có hướng dẫn: nhị phân sang thập phân
- Một số có phần mantissa
10110000và số mũ00000011. Tìm giá trị thập phân của nó. - Số mũ là $+3$. Phần mantissa bắt đầu bằng 1, vì vậy nó âm và được đọc theo quy tắc bù hai: khi là
1.0110000thì bit dấu có giá trị $-1$ và các bit phần thập phân cộng thêm $\tfrac14 + \tfrac18 = 0.375$, nên mantissa có giá trị $-1 + 0.375 = -0.625$. - $\text{number} = -0.625 \times 2^3 = -5.0$.
- Lỗi phổ biến nhất là đọc một mantissa âm như thể nó dương. Hãy kiểm tra bit đầu tiên trước bất cứ điều gì khác.
Một số thực có phần thập phân 10110000 và mũ 00000011. Giá trị thập phân của nó là gì?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Phần thập phân bắt đầu bằng 1, nên nó âm: −1 + 1/4 + 1/8 = −0.625. Nhân với 2^3 cho −5.0. Đọc nó như số dương là sai lầm thường gặp.
Ví dụ giải chi tiết: chuyển từ thập phân sang nhị phân
- Lưu $+2.5$ vào định dạng mantissa 8-bit, số mũ 8-bit tương ứng.
- Trong nhị phân, $2.5 = 10.1$. Viết dưới dạng phân số nhân với lũy thừa của hai: $2.5 = 0.101 \times 2^2$.
- Vậy phần thập phân là
01010000, bit dấu là 0 sau đó là.101được đệm bằng số không, và số mũ là00000010. - Luôn viết nó ở dạng chuẩn hóa trước; sau đó hai trường thông tin sẽ đọc trực tiếp.
Được viết dưới dạng phân số chuẩn hóa nhân với lũy thừa của hai, 2.5 = 0.101 x 2^__. Hãy cho biết số mũ.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
2.5 là 10.1 trong nhị phân; trượt dấu phẩy hai vị trí sang trái cho ta 0.101, vậy số mũ là 2 và phần thập phân là 01010000.
Chuẩn hóa
- Một số được chuẩn hóa khi bit đáng kể đầu tiên nằm ngay sau dấu nhị phân, do đó không có số không dẫn đầu bị lãng phí. Đối với số dương, phần thập phân bắt đầu bằng
0.1; đối với số âm, là1.0. - Lý do: nó tối đa hóa độ chính xác, vì mỗi bit của mantissa đều mang thông tin thay vì là một số 0 dẫn đầu.
- Để chuẩn hóa, dịch chuyển mantissa sang trái và giảm số mũ đi cùng số vị trí, hoặc dịch sang phải và tăng số mũ. Giá trị không đổi; chỉ có cách biểu diễn thay đổi.

Dịch chuyển các bit, điều chỉnh số mũ, giữ nguyên giá trị
Trao đổi giữa các bit mantissa và bit số mũ
- Tổng số bit là cố định, vì vậy hai trường này cạnh tranh nhau.
- Nhiều bit mantissa hơn có nghĩa là độ chính xác cao hơn: mỗi giá trị được lưu trữ chính xác hơn, với sai số làm tròn nhỏ hơn.
- Nhiều bit số mũ hơn có nghĩa là phạm vi rộng hơn: các đại lượng lớn hơn nhiều và nhỏ hơn nhiều có thể được biểu diễn, nhưng mỗi giá trị kém chính xác hơn.
- Một câu hỏi yêu cầu về tác động của việc di chuyển một bit từ trường này sang trường kia muốn đúng sự trao đổi này: phạm vi so với độ chính xác.
Chuẩn hóa số thực
Qua từng bước chuẩn hóa. Dịch chuyển số mantissa để loại bỏ các số không dẫn đầu vô ích — và điều chỉnh số mũ để khớp — giữ nguyên giá trị nhưng sử dụng tối đa từng bit cho độ chính xác.
Chuẩn hóa số thực:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Chuẩn hóa dịch chuyển phần thập phân sao cho bit đáng kể đầu tiên nằm ngay sau dấu phẩy — mỗi bit lúc đó đều mang thông tin, và giá trị không đổi.
Những phát biểu nào đúng về việc chuẩn hóa số thực? Chọn tất cả các đáp án áp dụng.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Chuẩn hóa chỉ thay đổi biểu diễn. Giá trị không đổi; đó chính là điều mà việc điều chỉnh số mũ đảm bảo.
xấp xỉ và hệ quả của nó
- Nhiều số thực thập phân không thể được lưu trữ chính xác trong nhị phân. $0.1$ là phân số lặp lại $0.000110011\ldots$, vì vậy nó phải bị cắt cụt: giá trị được lưu trữ gần với $0.1$ nhưng không bao giờ bằng nó.
- Sai số làm tròn tích lũy qua nhiều phép toán, đó là lý do tại sao
0.1 + 0.2không chính xác bằng0.3và tại sao đồng hồ của tên lửa Patriot bị lệch. - Vì vậy không bao giờ kiểm tra hai số thực bằng nhau: hãy viết
ABS(x - 0.3) < 1e-9thay vìx = 0.3. Và hãy cẩn trọng khi trừ hai giá trị gần bằng nhau, điều này sẽ làm mất đi hầu hết các chữ số có ý nghĩa. - Đối với các giá trị cần chính xác tuyệt đối, đặc biệt là tiền tệ, hãy sử dụng dấu cố định hoặc BCD thay thế.
Gắn mỗi thay đổi trong phân bổ bit với tác động của nó.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Kích thước từ cố định, nên độ chính xác và phạm vi đánh đổi lẫn nhau; quá lớn (overflow) và quá nhỏ (underflow) là trường hợp trường số mũ hết ở mỗi đầu.
Tràn và tràn ngược
- Tràn (Overflow) xảy ra khi kết quả quá lớn so với phạm vi của số mũ, do đó nó hoàn toàn không thể được biểu diễn.
- Tràn ngược (Underflow) xảy ra khi kết quả quá nhỏ, đến mức quá gần với zero mà số mũ không thể giảm thấp đủ, và nó bị làm tròn về zero.
- Cả hai đều là thuộc tính của kích thước trường số mũ, là mặt còn lại của sự trao đổi trên đây.
0.1 không thể được lưu trữ chính xác trong nhị phân (nó là phân số lặp), nên 0.1 + 0.2 không cho ra đúng 0.3 trên máy tính.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Các lỗi xấp xỉ nhỏ bé tích tụ lại — đó là lý do tiền tệ được xử lý bằng số cố định hoặc BCD, chứ không phải số thực.
Đối với các phép tính tiền tệ chính xác, bạn nên dùng:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Lỗi làm tròn số thực không chấp nhận được đối với tiền tệ; lưu trữ điểm cố định hoặc BCD giữ chính xác giá trị thập phân.
Điểm số dễ mất
- Mantissa là một phân số, không phải số nguyên: bit đầu tiên sau dấu là một nửa.
- Một mantissa bắt đầu bằng 1 là âm và tuân theo quy tắc bù hai. Hãy kiểm tra bit đó trước.
- Chuẩn hóa tối đa hóa độ chính xác; nó không thay đổi giá trị, và cũng không làm cho số trở nên lớn hơn.
- Nhiều mantissa hơn có nghĩa là độ chính xác, nhiều số mũ hơn có nghĩa là phạm vi. Tràn là quá lớn, tràn ngược là quá nhỏ.
Bạn đã nắm vững
- Dấu nhị phân di động lưu trữ $\text{mantissa} \times 2^{\text{exponent}}$, cả hai đều dùng bù hai; mantissa là một phân số nhị phân
- Chuyển đổi bằng cách đọc mantissa như một phân số (bù hai nếu nó bắt đầu bằng 1) và nhân với hai lũy thừa số mũ
- Chuẩn hóa có nghĩa là bit có ý nghĩa đầu tiên nằm ngay sau dấu, điều này tối đa hóa độ chính xác; dịch chuyển sang trái làm giảm số mũ
- Nhiều bit mantissa cung cấp độ chính xác, nhiều bit số mũ cung cấp phạm vi; nhị phân không thể lưu trữ nhiều số thực chính xác, vì vậy hãy dự kiến sai số làm tròn, so sánh với độ dung sai, và sử dụng dấu cố định hoặc BCD cho tiền tệ