상세 컨텐츠

본문 제목

[진짜 BigFloat 구현하기] 2. 덧셈과 뺄셈 구현하기

프로그래밍/Multi precision

by ∫2tdt=t²+c 2013. 11. 25. 00:45

본문



두 정수배열을 가지고 더하고 빼는건 이미 앞에서 여러번 구현했었죠. 그 코드 거의 그대로 사용합니다.


2012/11/05 - [프로그래밍/Multi precision] - BigFloat로 Pi를 구해보자-8. 어셈블리어로 최적화하기

2012/10/16 - [프로그래밍/Multi precision] - BigFloat로 Pi를 구해보자-2. 덧셈, 뺄셈 구현하기


위 글을 참고하시면 됩니다. 차이점은 위의 글의 코드에서는 높은 번지수에서 낮은 번지수로 내려가며 연산을 했지만, 이번에는 낮은 번지수에서 높은 번지수로 올라가며 연산을 한다는 겁니다. (이는 낮은 번지수가 낮은 자릿수를 나타내기로 했기때문이죠)

코드가 길어서 접어뒀습니다.


두 정수배열을 더하는 i_adds 함수. 덧셈 결과가 오버플로우되면 1을 리턴합니다.


정수배열에 32비트 정수 하나를 더하는 i_addu32 함수. 덧셈 결과가 오버플로우되면 1을 리턴합니다.


정수배열에 64비트 정수 하나를 더하는 i_addu64 함수. 덧셈 결과가 오버플로우되면 1을 리턴합니다.


끊어진 정수배열에 64비트 정수를 더하는 i_addu64_2 함수. 덧셈 결과가 오버플로우되면 1을 리턴합니다.


여기서 덧셈부분을 뺄셈으로만 고친 함수들도 있습니다.


그리고 마지막으로 뺄셈에서 사용할 2의 보수를 구해주는 함수입니다. 아랫자리에서의 받아올림 여부를 입력으로 받고, 오버플로우가 발생한 경우 1을 리턴합니다.





자 이 도우미함수들을 통해 실제로 덧셈 뺄셈을 구현하는 함수를 작성해보아요.

먼저 절대값을 더해주는 함수입니다.

두 부동소수점 데이터를 더하기 위해서는 먼저 서로 다른 지수부를 맞추는 작업이 필요합니다. 또한 덧셈에서 까다로운 부분이 있는데, 환형큐로 데이터를 표현하다보니 모든 자릿수가 한 덩어리의 배열로 표현되지 않는 경우도 있게 되죠. 이럴 경우 잘린 부분을 잘 처리해야 합니다.



뺄셈 역시 비슷하게 구현할 수 있습니다

뺄셈 구현에서 유의할 사항은 연산 결과가 오버플로우 발생한 경우 부호를 뒤집어 줘야한다는 거죠. (빼는 수가 더 크다는 뜻이므로)



이를 바탕으로 두 XL의 덧셈, 뺄셈을 연산하는 함수를 만들어봤습니다.



참쉽죠?



관련글 더보기

댓글 영역