2016년 9월 26일 월요일

부동소수점 연산 오류

부동소수점 연산은 치명적인 오류가 있습니다.













위에서 보다시피 0.1 더했는데 엉뚱한 값들이 나오게 됩니다.

 


부동소수점 오류의 발생 이유는
컴퓨터에서 10진수를 2진수로 변화할 발생하는 구조적인 문제이죠

이렇기 때문에 float값을 0 비교하거나
Float 값들을 비교할 때는 아래와 같은 방법을 쓰게 됩니다.

0 비교할 때는

if (sw * sw > Mathf.Epsilon)
두수의 제곱근을 구해 Mathf.Epsilon 비교

Mathf.Epsion 0 매우 가까운 값입니다.
( + Epsilon = ) 되지만
( 0 + Epsilon = 0 ) 되지요

Float 형끼리 비교할 때는

Mathf.Approximately(1.0F, 10.0F / 10.0F))


부동 소수점은 부정확하기에 비교를 위해서 등호(=) 연산자를 사용하는 것을 추천하지 않습니다.
(즉, 1.0 == 10.0 / 10.0 은 true를 반환하지 않을수도 있습니다.)








댓글 없음:

댓글 쓰기