반응형
유니티에서 1.0f != 1.0f가 true로 나오는 이유는 부동소수점(Floating Point) 비교의 정확도 문제 때문일 가능성이 매우 높습니다. 부동소수점은 컴퓨터에서 실수를 표현할 때 근사치를 사용하기 때문에, 동일해 보이는 값도 내부적으로는 미세한 차이가 있을 수 있습니다.
이유 설명:
- 부동소수점 표현의 제한
- 1.0라는 숫자는 컴퓨터 내부에서 이진수로 변환됩니다.
- 그러나 10진수인 는 2진수로 완벽히 표현되지 않아 근사치로 저장됩니다.
- 이 때문에, 두 개의 5.2를 비교할 때 내부적으로 미세한 차이가 발생할 수 있습니다.
- 연산 과정에서의 오차
- 부동소수점 값을 연산하거나 다른 변수에 저장하면, 그 과정에서 추가적인 오차가 누적될 수 있습니다.
- 이 오차가 비교 연산(!=)에서 영향을 미칩니다.
- 부동소수점 비교의 일반적인 결과
- == 연산이나 != 연산은 값을 직접 비교하므로, 미세한 오차가 있으면 false나 true로 결과가 달라질 수 있습니다.
해결 방법:
부동소수점 비교에서는 항상 **허용 오차(Epsilon)**를 사용하여 값을 비교하는 것이 좋습니다.
코드 예제:
float a = 5.2f;
float b = 5.2f;
// 허용 오차 정의
float epsilon = 0.00001f;
// 직접 비교 대신 허용 오차를 사용
if (Mathf.Abs(a - b) < epsilon)
{
Debug.Log("a와 b는 같다.");
}
else
{
Debug.Log("a와 b는 다르다.");
}
설명:
- Mathf.Abs(a - b)는 두 값의 차이의 절대값을 계산합니다.
- 이 차이가 epsilon보다 작으면 두 값이 같다고 간주합니다.
추가 참고:
- 부동소수점 문제는 단순히 Unity의 문제가 아니라, 대부분의 프로그래밍 언어에서 공통적으로 발생합니다.
- Unity에서는 부동소수점 비교에 Mathf.Approximately 메서드를 제공하므로 이를 활용하는 것도 좋은 방법입니다:
if (Mathf.Approximately(a, b))
{
Debug.Log("a와 b는 같다.");
}
else
{
Debug.Log("a와 b는 다르다.");
}
Mathf.Approximately는 부동소수점 비교에 적합한 허용 오차를 내부적으로 적용해줍니다.
float값을 더하거나 빼거나 한 경우에는 값이 미세하게 달라지는 경우가 많습니다.
이러한 작업은 나중에 디버깅하기 귀찮고 예상하지 못했던 에러가 발생합니다.
모두 조심해서 즐거운 코딩이 되셨으면 좋겠습니다.
반응형
'프로그래밍 월드 > 유니티(Unity)' 카테고리의 다른 글
[Unity] 유니티에서 개발하여 구글 앱스토어 등록할때 발생하는 에러(이 버전은 Google Play 64비트 요구사항을 준수하지 않습니다.) 해결방법 (0) | 2025.02.04 |
---|---|
[Unity] 유니티에서 화면 가로, 세로 화면을 지정하거나 고정시키기 (0) | 2025.02.04 |
(Unity)유니티의 PlayerPrefs 사용법 및 장점/단점 정리해 봅시다. (0) | 2025.01.29 |
유니티 에드몹 에디터에서는 광고가 잘 나오는데 안드로이드 기기에서 광고가 안나오는 현상을 수정해봅시다. (0) | 2025.01.21 |
유니티(Unity) Keystore의 비밀번호 잊어버렸을때 다시 찾는 방법 (0) | 2025.01.21 |