[BigFloat] 개발 중이던 소스 코드 공개

Posted by 적분 ∫2tdt=t²+c
2016.11.04 16:24 프로그래밍/Multi precision

생각해보니 BigFloat 라이브러리를 입대전까지 심심풀이로 개발하다가 그대로 방치해두었었군요.

블로그를 재정비하면서 그간 포스팅했던 소스코드의 + 기호가 공백으로 바뀌어버리는 참사가 발생해서 포스팅의 소스코드를 활용할 수 없게되었다는 소식을 받고선 아예 통으로 예전에 작업했던 코드를 공유합니다. 작업 중이던 녀석이고 공개하려고 생각도 안해서 주석도 거의 안 달리고 코드가 이쁘지도 않습니다.

그래도 꼭 필요하신 분들께는 도움이 되지 않을까 싶어서 공유하오니 무단으로 가져다가 '이거 다 제가 짰습니다!' 하시지만 않으면 됩니다. (중간중간에 버그가 있어서 통째로 가져가서 쓰시면 문제가 발생할수도 있구요)


임의정밀도 실수 연산에 대해서 구현된 것들은 다음과 같아요

  1. 덧셈, 뺄셈
  2. 크기 비교
  3. 곱셈, 카라슈바 곱셈
  4. 곱셈 후 덧,뺄셈
  5. 나머지 연산
  6. 역수
  7. 나눗셈, 빠른 나눗셈
  8. 빠른 이진 시프트 연산
  9. 지수 연산(exp)
  10. 제곱근 연산(sqrt)
  11. 거듭제곱 연산(pow)
  12. 로그 연산(log)
  13. 삼각함수(sin, cos, tan)
  14. 역삼각함수(asin, acos, atan)
  15. 반올림
  16. 10진 출력 함수
내부 어셈블리가 32비트 버전만 작성되어, 아직 64비트 코드는 없습니다. 기초 연산에 대해 64비트 최적화 어셈블리만 추가시키면 64비트로도 작동가능하지만 바쁜 관계로...

BigFloat.zip

Visual Studio 2012 프로젝트 압축파일입니다.



+

질문이 들어와서 정리해서 답변 추가했습니다.

10진수 변환출력에 관한 간단한 설명

A진법 정수 x를 B진법으로 변환하는 경우

x를 B로 나누어 그 몫을 x0, 나머지를 y0이라고 하고

x0을 다시 B로 나누어 몫을 x1, 나머지를 y1이라 하고

x1을 다시 B로 나누어 몫을 x2, 나머지를 y2라 하고


계속반복해서 몫이 0이 나올때까지 얻어진

yn, y(n-1), ... , y2, y1, y0 가 x의 B진법 표현이지요.


이와 마찬가지입니다. A에 2^32가 들어가고, B에 10^9(32비트에서 표현가능한 10의 가장 큰 거듭제곱 수)가 들어간 겁니다.

10 대신 10^9을 한 이유는 10으로 나누어 여러번 나누는 것보아 10^9으로 나누는게 연산 횟수를 줄일 수 있기 때문입니다. 어차피 큰수와 32비트 정수의 나눗셈이므로 10으로 9번 나누어보는것보다 10^9으로 한 번 나누는게 효율적이죠.

이때 A진법으로 n자리인 수가 B진법으로 변환하면 몇자리가 될지 대충 셈해보는 방법이 있습니다.

x가 A진법으로 n자리 수라는것은

이라는 뜻입니다.  이므로 부등호의 양변을 잘 조작해보면

가 되지요.

여기에 A=2^32, B= 10^9를 넣어 보면

이고, 저 로그부분을 근사값으로 계산해보면 1.07032887... 이 됩니다. 따라서

이죠. 그러므로 2^32진법으로 n자리인 수 x는 10^9진법으로는 최대 1.07033n자리가 되게 됩니다. 다만 이 수가 정수가 안되는 경우가 있을수 있으므로 정수로 캐스팅한 뒤 1을 더해주어 넉넉하게 배열을 미리 할당한 것이지요.




저작자 표시 비영리 동일 조건 변경 허락
신고
Tags
이 댓글을 비밀 댓글로
    • 나뚜
    • 2016.11.04 16:59 신고
    감사합니다~
    C++로 개발하는데 큰 도움이 될 것 같습니다!
    • 나뚜
    • 2016.11.05 10:57 신고
    매번 감사합니다!!