Tôi viết một vòng lặp đếm tăng lên với một phao, nhưng tôi đã đi qua một vấn đề số học dấu chấm động được minh họa trong ví dụ sau:C++ Làm thế nào để tránh dấu chấm động số học lỗi
for(float value = -2.0; value <= 2.0; value += 0.2)
std::cout << value << std::endl;
Đây là đầu ra:
-2
-1.8
-1.6
-1.4
-1.2
-1
-0.8
-0.6
-0.4
-0.2
1.46031e-07
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
Tại sao tôi nhận được 1.46031e-07
thay vì 0
? Tôi biết điều này có liên quan đến các lỗi dấu phẩy động, nhưng tôi không thể hiểu tại sao nó xảy ra và tôi nên làm gì để ngăn chặn điều này xảy ra (nếu có cách nào). Ai đó có thể giải thích (hoặc chỉ cho tôi một liên kết) sẽ giúp tôi hiểu? Bất kỳ đầu vào nào được đánh giá cao. Cảm ơn!
"Làm thế nào để tránh dấu chấm động lỗi số học" - bạn có thể không, xin lỗi. –
điều này đã được yêu cầu và trả lời nhiều lần – bernie
'0.2' không thể được biểu diễn chính xác bằng' float' (giả sử số học dấu chấm động IEEE754). Bạn có thể thấy điều này nếu bạn tăng độ chính xác của đầu ra: [example] (http://liveworkspace.org/code/3ZXIxx$0). – Mankarse