본문 바로가기
C++/이게 왜 돼 ❔❔❔

[C++] std::numeric_limits<T>::epsilon 사용해서 부동소수점 equlity 비교하기

by 트럼프 2022. 2. 11.

부동 소수점 타입의 고유 특성은 비교가 예상이 돼도 equality는 잘 쓰지 않는다고 한다.

즉, 부동소수점은 0과 같다(==) 같지 않다(!=) 를 직간접적으로 쓰지 않는 게 좋다는 것

 

기계 엡실론을 쓰면 된다.

std::numeric_limits<T>::epsilon()

float fVal1;
float fVal2;

if(fVal1==fVal2) {} 		// 지양
if(fVal1-fVal2==0.0f) {}	// 지양

if(fabs(fVal1-fVal2) > std::numeric_limits<float>::epsilon()){
	std::cout << " fVal1 - fVal2 는 0이 아니다." << std::endl;
}
if(fabs(fVal1-fVal2) < std::numeric_limits<float>::epsilon()){
	std::cout << " fVal1 - fVal2 는 0이다.(fVal1==fVal2)" << std::endl;
}

 

 

Ref :

https://docs.microsoft.com/ko-kr/cpp/standard-library/numeric-limits-class?view=msvc-170 

https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon

 

댓글