Khi so sánh gấp đôi cho sự bình đẳng, chúng ta cần đưa ra một mức độ khoan dung, vì tính toán dấu phẩy động có thể đưa ra lỗi. Ví dụ:So sánh dấu chấm động của phép gán liên tục
double x;
double y;
x = f();
y = g();
if (fabs(x-y)<epsilon) {
// they are equal!
} else {
// they are not!
}
Tuy nhiên, nếu tôi chỉ đơn giản gán một giá trị không đổi, mà không cần bất kỳ tính toán, tôi vẫn cần phải kiểm tra epsilon?
double x = 1;
double y = 1;
if (x==y) {
// they are equal!
} else {
// no they are not!
}
Có phải là ==
so sánh đủ tốt không? Hoặc tôi cần phải làm lại fabs(x-y)<epsilon
? Có thể giới thiệu lỗi khi chỉ định không? Tôi có quá hoang tưởng không?
Làm thế nào về đúc (double x = static_cast<double>(100)
)? Có phải đó sẽ giới thiệu lỗi dấu phẩy động không?
Tôi đang sử dụng C++ trên Linux, nhưng nếu nó khác ngôn ngữ, tôi cũng muốn hiểu điều đó.
Cho dù bạn cần một epsilon phụ thuộc vào tình hình. Ví dụ. khi bạn cần một phương trình chuyển đổi ('a == b && b == c' ngụ ý' a == c'), thì bạn không thể sử dụng epsilon. BTW, 'double x = 1' đã có nghĩa là' double x = 1' có nghĩa là 'double x = static_cast (1)' –
MSalters