Nói chung, lỗi dấu phẩy động đề cập đến khi một số không thể lưu trữ trong biểu diễn điểm nổi IEEE.
Số nguyên được lưu trữ với bit nhiều nhất là 1 và mỗi bit ở bên trái gấp đôi (2,4,8, ...). Thật dễ dàng để thấy rằng điều này có thể lưu trữ bất kỳ số nguyên lên đến 2^n, trong đó n là số bit.
Phần xác định (phần thập phân) của số dấu phẩy động được lưu trữ theo cách tương tự, nhưng di chuyển sang trái sang phải và mỗi bit liên tiếp bằng một nửa giá trị của số trước đó. (Nó thực sự phức tạp hơn một chút so với điều này, nhưng nó sẽ làm ngay bây giờ). Vì vậy, các con số như 0.5 (1/2) dễ dàng lưu trữ, nhưng không phải mọi số < 1 có thể được tạo bằng cách thêm một số lượng cố định các phần của dạng 1/2, 1/4, 1/8, ...
Ví dụ thực sự đơn giản là 0,1 hoặc 1/10. Điều này có thể được thực hiện với một chuỗi vô hạn (mà tôi không thể thực sự bị làm phiền), nhưng bất cứ khi nào một máy tính lưu trữ 0,1, nó không chính xác số này được lưu trữ.
Nếu bạn có quyền truy cập vào một máy Unix, thật dễ dàng để thấy điều này:.
Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.10000000000000001
>>>
Bạn sẽ muốn được thực sự cẩn thận với các bài kiểm tra bình đẳng với phao nổi và đôi, trong bất cứ ngôn ngữ bạn đang ở trong
(Như ví dụ của bạn, 0,2 là một số khác không thể lưu trữ trong nhị phân IEEE, nhưng miễn là bạn đang kiểm tra sự bất bình đẳng, chứ không phải là cân bằng, như p < = 0,2, thì bạn sẽ ổn .)
Tôi nghĩ rằng những gì bạn thực sự cần điều này là: [gì Mỗi nhà khoa học máy tính nên biết về Floating-Point Arithmetic] (http://docs.sun.com/source/ 806-3568/ncg_goldberg.html). – Patrick
Đọc bài này: http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1 –
Xem ví dụ Java đơn giản, shuld giống nhau trong C: http://stackoverflow.com/ a) 15790782/254109 – xmedeko