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
즉, 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