Hôm nay, tôi đã xem qua một số mã C ++ (được viết bởi người khác) và tìm thấy phần này:
double someValue = ...
if (someValue < std::numeric_limits<double>::epsilon() &&
someValue > -std::numeric_limits<double>::epsilon()) {
someValue = 0.0;
}
Tôi đang cố gắng tìm hiểu xem điều này thậm chí có ý nghĩa.
Các tài liệu cho epsilon()
biết:
Hàm trả về chênh lệch giữa 1 và giá trị nhỏ nhất lớn hơn 1 có thể biểu thị [bằng một lần kép].
Điều này có áp dụng cho 0 không, tức epsilon()
là giá trị nhỏ nhất lớn hơn 0? Hoặc có những con số giữa 0
và 0 + epsilon
có thể được đại diện bởi một double
?
Nếu không, thì không phải là so sánh tương đương với someValue == 0.0
?
numeric_limits<>::epsilon
là sai lệch và không liên quan. Điều chúng tôi muốn là giả sử 0 nếu giá trị thực tế khác nhau không quá một số ε từ 0. Và nên được chọn dựa trên đặc điểm kỹ thuật của vấn đề, chứ không phải dựa trên giá trị phụ thuộc vào máy. Tôi nghi ngờ rằng epsilon hiện tại là vô dụng, vì thậm chí chỉ một vài thao tác FP có thể tích lũy một lỗi lớn hơn thế.