2014-12-06 2 views
0

그래서 ... 같은 값인지 확인해야합니다. 그러나 그들은 결코 존재하지 않았고, 나는 그들이해야한다는 것을 알았고, 나는 나의 응용 프로그램을 디버깅하여 다음 결론에 도달했다.단순 산술 계산법이 0이어야합니다. 무한대가 반환됩니다.

-2.5f - Mathf.Round (1.1f) * 0.6f - (-3.1f) doest는 0이 아니다. 대신 가치가 -1.192093E-07

이 문제에 대한 적절한 설명이 있으며 해결 방법이 있습니까? 정말이 형식의 방정식이 필요합니다.

추 신 : 모든 값은 하드 코드되었지만 변수이며 다른 값도 있습니다. 문제는 결과가 0 일 때입니다.

여기에 코드 줄이 있습니다. Debug.Log (string.Format ("{0}", -2.5f - Mathf.Round (1.1f) * 0.6f - (-3.1f)));

Unity 4.5.1f3을 OS X 10.9.5에서 Monodevelop 4.0.1과 함께 사용하십시오.

+0

Unity 4.6.0f3에서도 재현되었습니다. –

+3

[부동 소수점 연산이 깨졌습니까?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

+0

이러한 질문에 unity3d 태그를 사용하십시오. –

답변

1

의견에서 -1.192093E-07은 무한대가 아니므로 0에 매우 가깝습니다. "E"다음에 빼기 기호가 있음을 확인하십시오. 값은 .0000001192093입니다.

부동 소수점 숫자를 비교할 때 부동 소수점 산술로 인해 이러한 종류의 작은 오류가 발생하므로 ==을 사용하면 안됩니다. 예를 here에 대한 "모든 프로그래머가 부동 소수점 연산에 대해 알아야 할 사항"읽기 좋은 생각이 될 수도

float diff = aValue - bValue; 
if(diff < 0.000001f && diff > -0.000001f){ 

} 

대신이 같은 것을 사용할 수 있습니다.

+1

심지어 엡실론 비교조차 큰 문제가 아닙니다. 읽을만한 좋은 자료는 http://realtimecollisiondetection.net/blog/?p=89입니다. – Bart