[CODE FUN] Lặp vô hạn khi dùng biến “float” để đếm trong vòng “for”

Hãy thử chạy chương trình bên dưới, bạn sẽ thấy điều ảo diệu xảy ra →

Chương trình sẽ bị lặp vô hạn trong vòng for.

TẠI SAO VẬY ???


Giải thích

Hầu hết các C++ compiler đều tuân theo IEEE 754 để biểu diễn số thực theo kiểu float hoặc double.
Trong đó kiểu float có độ chính xác đơn, sử dụng 32 bits để biểu diễn giá trị.

  • 1 bit dấu (Sign)
  • 8 bits biểu diễn giá trị mũ (Exponent)
  • 23 bits biểu diễn giá trị phần lẻ sau chuyển đổi (Mantisa)

Kiểu float chỉ có thể biểu diễn chính xác 7 chữ số (phần nguyên + thập phân). Do đó với code trong ví dụ trên thì giá trị của biến x không thể biểu diễn chính xác được. Cụ thể như sau →

  • 100000001.0f khi gán vào biến x thì giá trị thực của x sẽ là 100000000.0
  • khi cộng thêm 1.0f vào x thì giá trị thực của x vẫn là 100000000.0
  • 100000010.0f biểu diễn dưới dạng float thì giá trị thực là 100000008.0

(Các bạn có thể truy cập link này để convert online: http://www.binaryconvert.com)

Như vậy phép so sánh “x <= 100000010.0;” sẽ luôn trả về kết quả là true dẫn đến chương trình bị lặp vô hạn.


Nếu chương trình trên viết lại sử dụng kiểu double thì nó sẽ chạy bình thường →

Kết quả chạy chương trình →


Tham khảo thêm

— Phạm Minh Tuấn (Shun) —