Cảm ơn câu trả lời của bạn, họ đã giúp tôi rất nhiều.Tôi đã đọc các tài liệu này: first và second
Câu trả lời là để sử dụng chức năng của riêng tôi để so sánh tương đối:
bool areEqualRel(float a, float b, float epsilon) {
return (fabs(a - b) <= epsilon * std::max(fabs(a), fabs(b)));
}
Đây là giải pháp phù hợp nhất với nhu cầu của tôi. Tuy nhiên tôi đã viết một số bài kiểm tra và các phương pháp so sánh khác. Tôi hy vọng điều này sẽ hữu ích cho ai đó. areEqualRel vượt qua các thử nghiệm này, những người khác thì không.
#include <iostream>
#include <limits>
#include <algorithm>
using std::cout;
using std::max;
bool areEqualAbs(float a, float b, float epsilon) {
return (fabs(a - b) <= epsilon);
}
bool areEqual(float a, float b, float epsilon) {
return (fabs(a - b) <= epsilon * std::max(1.0f, std::max(a, b)));
}
bool areEqualRel(float a, float b, float epsilon) {
return (fabs(a - b) <= epsilon * std::max(fabs(a), fabs(b)));
}
int main(int argc, char *argv[])
{
cout << "minimum: " << FLT_MIN << "\n";
cout << "maximum: " << FLT_MAX << "\n";
cout << "epsilon: " << FLT_EPSILON << "\n";
float a = 0.0000001f;
float b = 0.0000002f;
if (areEqualRel(a, b, FLT_EPSILON)) {
cout << "are equal a: " << a << " b: " << b << "\n";
}
a = 1000001.f;
b = 1000002.f;
if (areEqualRel(a, b, FLT_EPSILON)) {
cout << "are equal a: " << a << " b: " << b << "\n";
}
}
Có thể muốn nhìn vào http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison này –
Phụ thuộc vào các trường hợp sử dụng, nhưng những gì về rất số nhỏ? Mã của bạn sẽ so sánh '1e-10' và' 1e-15' và '-1e-10' như nhau. Không có cách nào "chính xác" để so sánh các số dấu chấm động cho "sự gần gũi". – aschepler
Tại sao #define? Bạn chỉ có thể sử dụng một float const tĩnh cho mục đích này. – Puppy