반응형

유니티에서 1.0f != 1.0f가 true로 나오는 이유는 부동소수점(Floating Point) 비교의 정확도 문제 때문일 가능성이 매우 높습니다. 부동소수점은 컴퓨터에서 실수를 표현할 때 근사치를 사용하기 때문에, 동일해 보이는 값도 내부적으로는 미세한 차이가 있을 수 있습니다.

이유 설명:

  1. 부동소수점 표현의 제한
    • 1.0라는 숫자는 컴퓨터 내부에서 이진수로 변환됩니다.
    • 그러나 10진수인 는 2진수로 완벽히 표현되지 않아 근사치로 저장됩니다.
    • 이 때문에, 두 개의 5.2를 비교할 때 내부적으로 미세한 차이가 발생할 수 있습니다.
  2. 연산 과정에서의 오차
    • 부동소수점 값을 연산하거나 다른 변수에 저장하면, 그 과정에서 추가적인 오차가 누적될 수 있습니다.
    • 이 오차가 비교 연산(!=)에서 영향을 미칩니다.
  3. 부동소수점 비교의 일반적인 결과
    • == 연산이나 != 연산은 값을 직접 비교하므로, 미세한 오차가 있으면 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값을 더하거나 빼거나 한 경우에는 값이 미세하게 달라지는 경우가 많습니다.

이러한 작업은 나중에 디버깅하기 귀찮고 예상하지 못했던 에러가 발생합니다.

 

모두 조심해서 즐거운 코딩이 되셨으면 좋겠습니다.

반응형

+ Recent posts