Điểm nổi (Floating Point) được "lột xác": Hiểu rõ cách máy tính lưu trữ số thực

26 tháng 4, 2026·6 phút đọc

Bài viết này giải thích cơ chế hoạt động của chuẩn IEEE 754, từ cách mã hóa số học khoa học nhị phân đến việc xử lý các giá trị đặc biệt như NaN và Infinity, giúp lập trình viên hiểu rõ bản chất của tính toán số thực.

Điểm nổi (Floating Point) được "lột xác": Hiểu rõ cách máy tính lưu trữ số thực

Mặc dù được sử dụng hàng ngày trong lập trình, các số thực (floating point) thường được hiểu một cách mơ hồ và hành vi của chúng thường khiến nhiều người ngạc nhiên. Tuy nhiên, bản chất của chúng thực sự không phức tạp như vẻ bề ngoài. Bài viết này sẽ cùng bạn khám phá cách máy tính lưu trữ và xử lý các số điểm nổi theo chuẩn IEEE 754 phổ biến hiện nay.

Từ ký hiệu thập phân đến nhị phân

Để hiểu floating point, chúng ta hãy bắt đầu từ những điều cơ bản nhất. Hãy xem xét số thập phân 327.849. Các chữ số bên trái dấu thập phân lũy thừa của 10 tăng dần, trong khi bên phải là lũy thừa của 10 giảm dần.

Vì hệ thập phân đôi khi gây khó khăn khi biểu diễn các số quá lớn hoặc quá nhỏ, chúng ta sử dụng ký hiệu khoa học: 3,27849 x 10^2. Ký hiệu này có 3 thành phần chính: dấu (+), phần có nghĩa (significand, là 3,27849) và số mũ (exponent, là 2).

Điều thú vị là các quy tắc này hoàn toàn tương tự trong hệ nhị phân (base-2). Trong hệ nhị phân, các chữ số bên trái dấu phẩy nhị phân đại diện cho các lũy thừa của 2 tăng dần, và bên phải là giảm dần. Ví dụ, số nhị phân 1001.0101 tương đương với giá trị thập phân là 9.3125.

Các giá trị đặc biệt của điểm nổiCác giá trị đặc biệt của điểm nổi

Chúng ta cũng có thể viết số nhị phân này dưới dạng ký hiệu khoa học nhị phân: 1.0010101 x 2^3. Điểm đặc biệt là trong hệ nhị phân, chữ số khác 0 duy nhất là 1, nên mọi số khác 0 khi viết dưới dạng khoa học luôn bắt đầu bằng 1. Điều này giúp tiết kiệm bộ nhớ khi lưu trữ.

Bản chất của Floating Point

Nếu bạn đã nắm bắt được những điều trên, chúc mừng, bạn đã hiểu cách hoạt động của floating point. Về bản chất, floating point chỉ là số được viết dưới dạng ký hiệu khoa học nhị phân với hai giới hạn:

  1. Số chữ số trong phần có nghĩa là cố định.
  2. Số mũ bị giới hạn trong một phạm vi nhất định.

Chuẩn IEEE 754 định nghĩa các loại dữ liệu phổ biến như float (32-bit) và double (64-bit). Ví dụ, một float có 24 bit cho phần có nghĩa (số có nghĩa) và phạm vi số mũ từ -126 đến +127.

Cấu trúc của một số Float

Hãy xem cách mã hóa số -2343.53125 thành float:

  • Dấu (Sign): Dùng 1 bit. 0 cho dương, 1 cho âm. Ở đây là 1.
  • Số mũ (Exponent): Dùng 8 bit. Để tránh xử lý số âm, chúng ta cộng thêm một giá trị bias (đối với float là 127). Số mũ thực tế 11 sẽ trở thành 138 (10001010 trong nhị phân).
  • Phần có nghĩa (Significand): Dùng 23 bit. Vì chữ số đầu tiên luôn là 1 nên chuẩn này "ẩn" nó đi (implicit bit) để tiết kiệm 1 bit, chỉ lưu 23 bit còn lại.

Khi ghép ba phần này lại theo thứ tự: bit dấu -> bit số mũ -> bit phần có nghĩa, ta nhận được mã hóa nhị phân của số float.

Các giá trị đặc biệt

Chuẩn IEEE 754 dành các giá trị số mũ đặc biệt (0 và 255, sau khi bias) để biểu diễn các trường hợp không phải số thông thường:

  • Số 0: Khi số mũ bias là 0 và phần có nghĩa toàn 0, ta được số 0. Chuẩn định nghĩa cả +0.0 và -0.0. Điều này hữu ích để biết chiều hướng của phép chia (chia dương cho +0.0 ra dương vô cực, cho -0.0 ra âm vô cực).
  • Vô cực (Infinity): Khi số mũ bias là max (255) và phần có nghĩa toàn 0. Vô cực xuất hiện khi làm tròn một số quá lớn hoặc chia số dương cho 0.
  • Không phải số (NaN - Not a Number): Khi số mũ là max và phần có nghĩa khác 0. NaN thường là kết quả của các phép toán vô nghĩa như căn bậc 2 của số âm. Một đặc điểm thú vị là NaN không bằng bất kỳ giá trị nào, thậm chí không bằng chính nó.

Số con chuẩn (Subnormals)

Có một khoảng trống giữa số nhỏ nhất có thể biểu diễn (khi số mũ bias là 1) và số 0. Để lấp đầy khoảng trống này và giảm thiểu việc làm tròn về 0 quá sớm, chuẩn IEEE 754 sử dụng các số con chuẩn (subnormals hoặc denormals).

Khi số mũ bias là 0, quy tắc thay đổi: bit ẩn (implicit bit) được giả định là 0 thay vì 1, và số mũ thực tế được coi là -126. Điều này cho phép biểu diễn các số cực kỳ nhỏ, giúp tính toán x - y có kết quả khác 0 ngay cả khi x và y rất gần nhau. Sự đánh đổi là độ chính xác giảm đi khi số càng nhỏ.

Độ chính xác và vấn đề 0.2

Tại sao 0.2 trong hệ thập phân lại không được lưu chính xác trong máy tính? Hãy xem biểu diễn nhị phân của nó. 0.2 trong nhị phân là một chuỗi vô hạn tuần hoàn. Vì float chỉ có hữu hạn bit để lưu phần có nghĩa, các bit dư thừa phải bị cắt bỏ và làm tròn. Kết quả là giá trị lưu thực tế sẽ chênh lệch rất nhỏ so với 0.2. Điều này giải thích hiện tượng 0.1 + 0.2 != 0.3 nổi tiếng trong lập trình.

Ngoài ra, do số mũ có giới hạn, các số quá lớn (như 2^200) hoặc quá nhỏ (như 2^-300) không thể biểu diễn trong float.

Chuyển đổi kiểu và Làm tròn

Khi chuyển đổi từ kiểu độ chính xác thấp sang cao (ví dụ half sang float), giá trị được giữ nguyên chính xác. Tuy nhiên, khi chuyển từ cao xuống thấp, chúng ta phải làm tròn và có thể mất mát dữ liệu (precision loss) hoặc bị tràn (overflow thành infinity).

Quy tắc làm tròn mặc định là "làm tròn đến số chẵn gần nhất" (round-to-nearest-even). Điều này giúp tránh sự thiên lệch thống kê trong các phép tính tổng hợp, khác với quy tắc làm tròn "nửa lên" thông thường.

In ấn và Debugging

Để debug hoặc lưu trữ chính xác một số floating point, dạng thập phân thông thường (%f) thường không đủ chính xác để khôi phục lại bit ban đầu. Giải pháp tốt nhất là sử dụng dạng thập lục phân (%a trong C/C++).

Dạng in thập lục phân, ví dụ 0x1.000p+1, cung cấp biểu diễn ngắn gọn và chính xác tuyệt đối về mặt bit của số thực, giúp lập trình viên dễ dàng thao tác và kiểm tra dữ liệu nhị phân.

Kết luận

Hiểu rõ về IEEE 754 không chỉ giúp lập trình viên tránh các lỗi logic khó chịu liên quan đến tính toán số thực, mà còn giúp trân trọng sự thiết kế tinh tế và đẹp đẽ của nền tảng máy tính hiện đại. Từ việc xử lý bit ẩn, số mũ có độ lệch, cho đến các trường hợp đặc biệt như NaN, tất cả đều tạo nên một hệ thống hoàn chỉnh và mạnh mẽ.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗