1 Results for '부정확성'

  1. 2008.09.18 부동 소수점 연산의 부정확성

이 모든 것은 바로 수학과 전산 기초 시간에 졸았기 때문에 발생하는 것이죠. 바로 부동 소수점(float나 double)의 연산 결과 아니 심지어는 표현 자체가 정확하지 않다는 것 말이에요.

유용한 실버라이트 팁을 올리고 있는 Silverlight Tips of the Day 블로그에 1.05 != 1.05 - 부동 소수점 비교의 문제에 관한 포스팅이 올라왔고 실버라이트 카페의 쇼티님이 번역해주셨는데요, 저도 수학/전산시간에 졸았기 때문에 다시 한번 부동 소수점 연산에 대해 공부하게 되었네요.

이론적인 설명은 수학에 젬병인 저보다는 위키 사전을 참고하시면 명확 할 것 같아요.

결론만 뽑아서 얘기하자면,

  1. 원래 2진수로 표현되는 소수는 부정확하다.
    (ex : 0.1(10) = 0.000110011...     1/3 = 0.01...)
  2. 32비트(8바이트) double 값의 가수부는 52비트를 사용하며 C#의 경우 15~16자리의 숫자만이 유효할 수 있다. (일단 15자리라고 생각하는 게 편리)
  3. C#의 부동 소수점 연산은 IEEE 754의 표준을 따르고 있다.
  4. 따라서 특히 다음의 경우에 주의가 필요하다.
  • 두 수가 같은지 확인하는 문제
    ; 보통 두 수가 같음을 확인 할 때에는 적당한 오차값을 기준으로 비교
  • -연산(뺄셈)
    ; 특히 이 연산에서 오차가 심해짐
  • 정수 변환 및 반올림 문제
  • 유효 지수 범위를 벗어날 경우 발생할 수 있는 비정상 값 혹은 0이 될 수 있는 문제
  • 나눗셈에서 제수가 0이 아님을 체크할 때 발생할 수 있는 문제

네 따라서 이 문제는 실버라이트의 버그가 아닌 부동 소수점 연산이 원래 가지고 있는 부정확성에 관한 문제이고, 이것은 프로그래머가 적당한 한계 오차값(tolerance)를 정하여 연산 할 필요가 있겠네요.

이런 복잡한 문제를 쉽게 해결하기 위한 한가지 방법은 Math.net 이라는 프로젝트에서 제공하는 몇가지 부동 소수점 관련 메서드를 사용하는 건데요, 아쉽게도(?) 이 프로젝트는 GPL및 LGPL하에 배포되고 있어서 상용 프로젝트에 적용하기엔 애로사항이 꽃피죠.

여튼, 이 문제는 굉장히 오랫동안 프로그래머들을 괴롭혀왔던 것이고 해서 정밀 계산에 대해 경험이 많은 분들이라면 나름의 노하우를 가지고 있을 것 같아요. 저야 분야가 소수점 연산을 해야할 일이 거의 없었던지라 여기에 대해서는 깜깜인데요, 혹시 좋은 노하우나 참고 자료가 있다면 알려주세요.

저작자 표시 동일 조건 변경 허락
신고
Posted by gongdo


티스토리 툴바