Trong khi lập trình, bạn sẽ rất hay gặp phải một mệnh đề toán học rất vô lý: “0.1+0.2 ≠ 0.3“. Cho dù là bạn dùng C++, javascript, hay python … Mình đã từng đặt câu hỏi này trong các cuộc phỏng vấn, và câu hỏi này dường như rất ít ứng viên trả lời được.
Nếu không tin, bạn có thể kiểm chứng bằng cách mở browser ra, bấm F12, rồi nhập vào thử, bạn sẽ thấy như hình dưới:

Đây là một vấn đề nổi tiếng trong tính toán số học về dấu chấm động. Lỗi này xảy ra vì số thực (floating-point numbers) không thể được biểu diễn chính xác trong hệ nhị phân.
Con người chúng ta dùng hệ thập phân để biểu diễn một số bất kỳ bằng tổng một chuỗi các lũy thừa của . Ví dụ:
Khi chuyển sang hệ nhị phân, một số cũng được biểu diễn bằng tổng một chuỗi các lũy thừa của :
Các bạn chú ý là trong bài viết này, mình dùng ký hiệu dạng để biểu đạt một giá trị ở hệ đếm . Ví dụ: nghĩa là giá trị ở hệ nhị phân và có giá trị là ở hệ thập phân.
Trong hệ nhị phân, giá trị thực chất là một chuỗi xấp xỉ vô hạn trong hệ nhị phân:
Tương tự, trong hệ thập phân cũng cũng là một dãy vô hạn xấp xỉ trong hệ nhị phân. Tuy nhiên, trong máy tính, dãy này không vô hạn mà bị giới hạn (thường là hoặc bit). Biểu diễn số ở máy tính được dùng theo chuẩn IEEE 754 sử dụng 64 bit, theo đó:
(0x3DCCCCCD)
(0x3E4CCCCD)
(0x3E99999A)
Khi thực hiện phép tính trên máy tính thì:
Nhưng vậy giá trị của là 0x3E99999B (khi biểu diễn bit) hay . Vì thế kết quả này khi so sánh với (0x3E99999A) ở trên là không khớp với (0x3E99999B) nên máy trả về False.
Đó chính là nguyên nhân sâu xa của nghịch lý này.
No comments yet. Be the first to comment!