상세 컨텐츠

본문 제목

[진짜 BigFloat 구현하기] 1. 기본 자료구조와 수치 표현 방법 정하기

프로그래밍/Multi precision

by ∫2tdt=t²+c 2013. 11. 20. 23:51

본문


잠깐 수학 시간 !

모든 유리수(메모리가 유한한 관계로 무리수를 포함할 실수를 완벽하게 표현하는건 불가능하겠죠)는 다음과 같은 형태로 표현 가능합니다.


(a는 적절한 정수, p는 적절한 (정수)단위수, e는 적절한 (정수)지수)

이 말은 즉 a와 p와 e 값과 부호를 담으면 (메모리가 허용하는한) 모든 유리수를 표현할 수 있다는 말이 되겠죠. p는 컴퓨터 연산에 적합하도록 2의 제곱수로 고르면 편하겠죠. 32비트CPU에 맞춰서 p를 2^32로 잡으면 연산시에 간편하고 좋겠죠. 지수부 e는 32비트 정수 하나로도 충분히 표현가능합니다. -21억 정도에서 +21억 정도까지가 가능한데, 이 지수부로 표현가능한 값은 다음과 같으니까요


작을 경우 소수점 아래로 200여억 자리, 클 경우 소수점 위로 200여억자리까지 표현가능하다는 건데 이 정도 정밀도면 충분하고도 남죠.


a는 2^32진법의 정수배열로 표현합니다.


따라서 유리수를 표현하는데에는 정수배열과 지수부, 부호만 있으면 충분하겠군요! 하지만 정수배열 대신 환형큐를 사용하는게 정밀도를 자유로이 조절하는게 편할것이라고 앞 글에서 언급했었죠. 그래서 구조체는 다음과 같이 됩니다.



환형큐를 어느정도 알고 있다는 가정하에 설명을 진행합니다.

환형큐는 말 그대로 뱅글뱅글 돌아가며 자료를 추가 삭제합니다. 앞쪽에 추가할 경우 begin이 1감소하고, 뒤쪽에 추가할 경우 end가 1증가하죠. 만약 begin이 음수가 되면 size로 돌아가서 카운트하게 되고, end가 size를 넘어서면 0으로 가서 카운트하게 되죠.


이제 생성하고 삭제하는 함수와 기초적인 큐 관리 함수를 짜보도록 하겠습니다.




추가적으로 몇가지 기초 함수도 짜보았습니다



볼수 있듯이 sign이 0이면 양수, 1이면 음수 -1(0xFFFFFFFF)이면 NaN이라고 정의했습니다.


기본적인 부분이 마련이 되었으니 다음 글에서부터는 사칙연산을 구현하겠습니다!

관련글 더보기

댓글 영역