if (0.3 == 0.1 + 0.2)
std::cout << "equal";
else
std::cout << "not equal"; // not equal 출력
=,>)에 한계가 있다if (foo() == 0.0) // foo()가 0.0을 리터럴로 반환할 경우
constexpr double gravity { 9.8 };
if (gravity == 9.8) // 리터럴로 초기화 했으므로 가능
if (gravity == 9.8f) // 자료형이 다르므로 변환과정에서 오차 생겨 불가능
if (std::abs(a - b) <= absEpsilon)
return true;
Epsilon보다 작으면 같다고 판정1.0과 1.00001이 다르다는 것은 괜찮지만, 100000.0과 100000.00001도 다르다고 하기에는 문제가 있어보임bool approximatelyEqualAbsRel(double a, double b, double absEpsilon, double relEpsilon)
{
// 먼저 epsilon으로 비교
if (std::abs(a - b) <= absEpsilon)
return true;
// 상대적 epsilon으로 재비교
return (std::abs(a - b) <= (std::max(std::abs(a), std::abs(b)) * relEpsilon));
}
relEpsilon을 통해 비교하는 수의 크기에 따라 epsilon의 크기도 조정하여 판단한다