Nó đưa ra câu trả lời "sai" đơn giản vì không phải tất cả các giá trị thực đều được thể hiện bằng phao (hoặc gấp đôi, cho vấn đề đó). Những gì bạn sẽ nhận được là một xấp xỉ dựa trên mã hóa cơ bản.
Để đại diện cho tất cả các giá trị thực sự, thậm chí giữa 1.0x10 -100 và 1.1x10 -100 (mức giới hạn thực sự rất nhỏ), bạn vẫn cần một số lượng vô hạn các bit.
Giá trị IEEE754 chính xác duy nhất chỉ có 32 bit (một số trong đó được giao nhiệm vụ cho những thứ khác như số mũ và đại diện NaN/Inf) và do đó không thể cung cấp cho bạn độ chính xác vô hạn. Họ thực sự có 23 bit có sẵn cho độ chính xác của khoảng 2 (có thêm một bit ngầm) hoặc chỉ hơn 7 chữ số thập phân (log (2) là khoảng 7,2).
Tôi kèm theo từ "sai" trong dấu ngoặc kép vì nó không phải là thực sự là sai. Có gì sai là sự hiểu biết của bạn về cách máy tính đại diện cho con số (không được xúc phạm mặc dù, bạn không đơn độc trong sự hiểu lầm này).
Đi qua trên http://www.h-schmidt.net/FloatApplet/IEEE754.html và nhập số của bạn vào hộp "Biểu diễn thập phân" để xem điều này hoạt động.
Nếu bạn muốn có con số chính xác hơn, hãy dùng gấp đôi thay vì nổi - số này có gấp đôi số bit có sẵn để biểu diễn giá trị (giả sử triển khai C của bạn đang sử dụng loại dữ liệu chính xác đơn và đôi IEEE754 cho float và double tương ứng).
Nếu bạn muốn có độ chính xác tùy ý, bạn sẽ cần sử dụng thư viện "bignum" như GMP mặc dù hơi chậm so với các loại gốc để đảm bảo bạn hiểu được sự cân bằng.
Tôi biết điều này đã xảy ra trong trường hợp C#. Nhưng không bao giờ biết trong trường hợp của C. – anonymous
'float 'của C cũng là loại chính xác cố định nên không có sự khác biệt với C#. –