Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 선택정렬
- 프로그래머스
- C++
- UML관련
- map
- 람다
- enumasByue
- 알고리즘
- 애셋로드
- UE_LOG
- dataasset
- 스마트포인터
- C++최적화
- stl
- 언리얼가비지컬렉터
- 델리게이트
- 정렬알고리즘
- unorder_map
- 정렬
- UE4 커스텀로그
- 약참조
- UELOG
- 언리얼엔진구조체
- 강참조
- 람다사용정렬
- 자료구조
- 크리티컬섹션
- moreeffectiveC++
- 데이터애셋
- BFS
Archives
- Today
- Total
기억을 위한 기록들
[UE-CPP] 부동소수점 비교시 본문
코드를 작성하다보면 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
'UnrealEngine > UnrealEngine C++ 관련' 카테고리의 다른 글
[UE CPP] 체력관리 컴포넌트 (HealthManageComponent) (0) | 2023.07.16 |
---|---|
[UE-CPP] FStruct를 TMap/TSet의 Key로 사용하고 싶다면?(with GetTypeHash) (0) | 2023.07.09 |
[UE-C++] 특정 액터가 블루프린트 상속받은지 확인하는 방법 (0) | 2023.03.02 |
UE - GAS(Game Ability System)에 관하여 (0) | 2023.03.01 |
[UECPP] 클래스이름 변경할때 블루프린트 애셋이 상속받고 있을 경우 (0) | 2023.02.10 |