드디어 오류를 잡아냈다.

Posted by 적분 ∫2tdt=t²+c
2010.09.11 12:55 프로그래밍/Multi precision
BigReal (무한(?)정밀도 부동소수점 데이타)를 1~2년 전에 만들어 놓았었는데,
Pi값을 계산해보는데 자꾸 10^(-21) 부근에서 오차가 발생해서 좁혀지지 않길래 포기했었다.

그리고 1~2년이 지나고 'PC로 도전하는 원주율'이라는 책을 읽고선 다시 도전하고 싶은 마음이 생겨서 코드를 다시 들여다 보았다.
Pi계산하는 로직에는 전혀 문제가 없는데, 자꾸 알수 없는 오차들이 발생하는 것이었다. 부동소수점 형식의 어쩔수 없는 문제다! 라고 치부해버리려고 했는데, 이틀 동안 면밀히 분석해본 결과 BigInt 함수를 이용하여 덧셈하는 부분에 문제가 있었던 것이었다.

시프트하는 부분에서 dats[i]>>(32-src) 이런 코드가 있었는데 이것이 src가 0일때 오작동한다. src가 0이면 dats[i]>>32가 되니깐 0이 나와야 할것이라고(dats는 int배열) 착각하기 쉬운데, 표준에는 시프트연산은 32보다 작은수에 대해서 정의되어 있다!!!!

http://zfanta.com/entry/visual-studio%EC%9D%98-%EC%89%AC%ED%94%84%ED%8A%B8%EC%97%B0%EC%82%B0-%EB%B2%84%EA%B7%B8
바로 이 버그가 발목을 잡았던 것!!!

참고로 이것은 vc뿐만 아니라 gcc에서도 해당되는 문제니깐 vc를 깔 일은 아니다. (난 gcc로 컴파일했는데도 저 문제가 발생했으므로!)

그것을 수정하고나니 이제는 Pi값을 수 만자리까지도 척척 계산해낸다. 오늘은 정말 흐뭇한 날이다!
이 댓글을 비밀 댓글로
  1. 헤헤
    • 지나가던 백수
    • 2016.12.06 16:16
    멋지십니다 헤헤