관리 메뉴

기억을 위한 기록들

[UE-CPP] 부동소수점 비교시 본문

UnrealEngine/UnrealEngine C++ 관련

[UE-CPP] 부동소수점 비교시

에드윈H 2023. 5. 14. 21:56

코드를 작성하다보면 flaot  소숫점 비교를 자주 하게 되는데, 습관적으로 == 연산자를 사용하게 된다.

 

대부분~~(정말?) 괜찮을 수 도 있긴하지만, 정밀도가 떨어진다. 같은 변수 2개의 각각 1.0이 있다고 해서 같은수라는 보장이 없다.

(ex 변수 2개가 각각 내부에서 1.0000004 / 1.0000006  이렇게 되어있다면 같은 값이 아니다.)

 

float a = 3.0f;
float b = 3.0f;

if( a == b ) //이렇게 하지말고
{
	//Do Something
}

그래서 단순 == 연산자로 비교하지 말고, 언리얼에서 제공 하는 함수를 이용한다고 하면

float a = 3.0f;
float b = 3.0f;



if(true == FMath::IsNearlyEqual(a, b)) //이렇게나
{
	//Do Something
}

// 허용하는 오차범위를 지정하고 싶다면(Tolerance)
const float Tolerance = 0.0000001f;
if(true == FMath::IsNearlyEqual(a, b, Tolerance)) //이렇게 할 것.
{
	//Do Something
}

 

(지나가면서 보는 내부 함수)

1.e-8f은 숫자는 아래 글 참고 하면, 1e-9f 8> 1 x 10^-8 -> 0.00000001 이라고 한다

https://hyo-ue4study.tistory.com/419

 

[CPP] C++에서의 1e-6f 란? (과학적 표기법/scientific notation)

언리얼엔진4 소스 UCharacterMovementComponent 를 살펴보던 중 아래와 같은 변수를 발견했다. const float UCharacterMovementComponent::MIN_TICK_TIME = 1e-6f; 여기서 1e-6f은 무슨 뜻일까? 과학적 표기법(scientific notation)

hyo-ue4study.tistory.com

즉, IsNearlyEqual이라는 함수는 두 float을 빼면서 나오는 절대값이 엄청나게 작은 오차만 있을때 true를 반환 한다는 것이다.

 

 

위와 비슷하지만 다른 매크로의 사용이라고 하면

if(FMath:Abs(a-b) <= FLT_EPSILON) //이렇게
{
	//Do Something
}

앱실론(EPSILON) 이라는 매크로는 아주 작은 실수를 나타내고 있다.

해당 매크로 참고 자료에 의하면, 아래와 같이 설명 해주고 있다.

 

https://learn.microsoft.com/ko-kr/cpp/c-language/limits-on-floating-point-constants?view=msvc-170 

 

부동 소수점 상수에 대한 제한

자세한 정보: 부동 소수점 상수에 대한 제한

learn.microsoft.com