생각해보니 BigFloat 라이브러리를 입대전까지 심심풀이로 개발하다가 그대로 방치해두었었군요.
블로그를 재정비하면서 그간 포스팅했던 소스코드의 + 기호가 공백으로 바뀌어버리는 참사가 발생해서 포스팅의 소스코드를 활용할 수 없게되었다는 소식을 받고선 아예 통으로 예전에 작업했던 코드를 공유합니다. 작업 중이던 녀석이고 공개하려고 생각도 안해서 주석도 거의 안 달리고 코드가 이쁘지도 않습니다.
그래도 꼭 필요하신 분들께는 도움이 되지 않을까 싶어서 공유하오니 무단으로 가져다가 '이거 다 제가 짰습니다!' 하시지만 않으면 됩니다. (중간중간에 버그가 있어서 통째로 가져가서 쓰시면 문제가 발생할수도 있구요)
임의정밀도 실수 연산에 대해서 구현된 것들은 다음과 같아요
Visual Studio 2012 프로젝트 압축파일입니다.
+
질문이 들어와서 정리해서 답변 추가했습니다.
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을 더해주어 넉넉하게 배열을 미리 할당한 것이지요.
XFloat : High Precision Library for Javascript (0) | 2015.09.29 |
---|---|
빠른 나눗셈 알고리즘을 찾아서 3 (0) | 2014.04.22 |
빠른 나눗셈 알고리즘을 찾아서 2 (0) | 2014.04.16 |
빠른 나눗셈 알고리즘을 찾아서 1 (1) | 2014.04.16 |
톰-쿡 알고리즘 개요 (0) | 2014.03.30 |
[진짜 BigFloat 구현하기] 5. 카라슈바 알고리즘으로 곱셈 성능 향상 (1) | 2014.03.11 |
댓글 영역