What is the most effective way for float and double comparison?에서 제안 된 것처럼 엡실론을 사용하는 복식의 비교 함수를 정의했습니다. 절대 값의 차이가 ε보다 작 으면 두 개의 double이 다릅니다.C++ 엡실론을 사용하는 복식의 비교
d2 = d1 + epsilon 인 d1과 d2를 두 배로 사용하면 d1은 ε만큼 다르기 때문에 d2는 d2와 같지 않아야합니다. 권리?
일부 값은 작동하지만 항상 작동하지는 않습니다. 아키텍처 나 컴파일러와 관련이있을 수 있습니까? 비교 기능을 개선하려면 어떻게해야합니까? 내 컴퓨터에
#include <iomanip> // For std::setprecision
#include <iostream>
#include "math.h" // For fabs
const double epsilon = 0.001;
bool equal(const double &d1, const double &d2)
{
return fabs(d1-d2) < epsilon;
}
int main()
{
double d1 = 3.5;
double d2 = d1+epsilon;
// d2 = d1 + epsilon should not be equal to d1.
std::cout << std::setprecision(16) << "d1 = " << d1 << " d2 = " << d2 << std::endl;
bool eq = equal(d1,d2);
if (eq)
{
std::cout << "They should not be equal, but they are!" << std::endl;
}
else
{
std::cout << "They are not equal. OK!" << std::endl;
}
}
출력 :
D1 = 3.5 (D2) = 3.501
그들은 동일하지 않아야하지만, 그들은있다!
"나는 D2 =의 D1 + 엡실론과 복식 D1과 D2가있는 경우, D1은 엡실론 차이가 있기 때문에 D2 같아야 안된다. 그렇지?" 아니, 정확히 같은 이유로. – Slava
부수적으로'std :: setprecision' 스트림 수정자는 내장 타입 정밀도를 수정하지 않습니다. 내장 유형 정밀도는 수정할 수 없습니다. – Ron
아이러니가 보이지 않습니까? 부동 소수점 산술 연산이 부정확하다는 사실에 대처하기 위해 엡실론 비교를 사용하고 '엡실론'을 포함한 표현식에 대해 정확한 결과를 기대합니다. 'd1 + 엡실론'의 정확한 수학적 값은'double'에서 표현할 수 없으므로'd2'는 약간 작아집니다. –