3^0.5를 소수점 이하 100만 자리 까지 구하고 싶습니다.
글쓴이: peacepiece / 작성시간: 화, 2007/10/23 - 10:00오전
안녕하세요.
C 언어로 3의 0.5승 또는 √3을 소수점 이하 100만 자리 까지 계산하고 싶습니다.
pow 함수로는 소수점 이하 16자리 까지 밖에 안되더군요. ^^;
큰자리수의 표현을 위해서 int 배열을 주판처럼 만들어서 계산 할 생각인데...
당췌 계산하는 방법을 모르겠습니다.
질문 1 : 3의 0.5승을 기본연산(+-*/)으로 계산 할 수는 없나요??
질문 2 : pow 함수의 소스 코드를 좀 봤으면 좋겠는데 어디서 볼 수 있는지 아시는분 있으시면 알려주시기 바랍니다.
Forums:
위키피디아에 질문
위키피디아에 질문 1에 관련된 내용이 있는것 같은데요..
http://en.wikipedia.org/wiki/Square_root
http://en.wikipedia.org/wiki/Square_root_of_3
링크를 몇개 따라가다 보니, 이런 웹사이트도 있네요.
http://pi.lacim.uqam.ca/piDATA/sqrt3.txt
http://antwrp.gsfc.nasa.gov/htmltest/gifcity/sqrt3.1mil
뉴턴법
뉴턴법을 쓰시면 됩니다. 빨리 수렴하고, 불안정성이 있지만 제곱근 구하는 경우에는 상관없습니다.
자세한 내용은 위키백과를 참조하세요.
http://en.wikipedia.org/wiki/Newton's_method
√n 은 f(x) = x^2 - n 의 근이니까, f'(x) = 2x 이고
x_n+1 = x_n - f(x_n)/f'(x_n) = x_n - (x_n^2 - n)/2x_n = (x_n^2+n)/2x_n
루트 3을 구하기 위해 n = 3 으로 하고 x_0 = n 으로 잡으면,
x_1 = 3*3+3 / 2*3 = 12/6 = 2
x_2 = 2*2+3 / 2*2 = 7/4 = 1.75
x_3 = 1.75*1.75+3 / 1.75*2 = 97/56 = 1.732...
반복 3번만에 소수점 3자리까지 정확하게 나옵니다.
int 배열로 큰 정수의 덧셈, 곱셈, 나눗셈만 구현하신 후 위 과정을 반복하면 제곱근을 구할 수 있습니다. 0.5가 아닌 다른 실수로 제곱하는 경우 도함수를 다시 구해서 뉴턴법을 적용하면 됩니다.
파이썬 소스 코드
GMPY 모듈(http://gmpy.sourceforge.net/)을 써서 파이썬으로 작성해 보았습니다. 전체 20줄이고, 100만자리까지 구하는 데 제 컴퓨터에서 3분 33초 걸렸습니다. (별 의미는 없지만, 초당 4700자리씩입니다.)
100자리까지 구할 때 다음과 같이 실행하시면 됩니다.
python sqrt.py 100
속도라면 이미 있는
속도라면 이미 있는 것을 활용하는 것이 좋을 듯합니다.
3초쯤 걸리더군요. C버젼과 크게 차이나지 않는 것 같습니다.
PARI/GP
PARI/GP로 하니까 62초만에 됩니다. 데비안에서는 apt-get install pari-gp 로 설치하고,
위 코드를 sqrt.gp 파일에 저장한 다음에 gp sqrt.gp 와 같이 실행하면 됩니다. (루트 3을 100만자리까지 15M 메모리로 구함)
bc
bc로 해 보았는데...
17시간 15분 걸렸습니다. (P-IV 2.8g x 1) 메모리는 거의 안쓰는것 같더군요.
--
익스펙토 페트로눔
--
익스펙토 페트로눔
첨에 17분인줄
첨에 17분인줄 알았네요, 돌리다가 안 되네 하고 멈췄는데......대단하십니다. 끝까지 돌리시다니.
Perl 버젼
perl Math::BigFloat 모듈은 내부적으로 GMP혹은 Pari 라이브러리가 설치되어 있으면
그것을 사용하고 혹은 직접지정 없으면 pure perl구현 라이브러리를 사용하는 구조입니다.
GMP로 지정하고 돌리니 몇초안에 끝나버리네요.
pure perl구현은 답이 언제 나올지 몰라 중간에 중지 시켜버렸습니다.
다들
다들 대가시군요...
모르는 제가 한심해 보입니다...
대학교는 괜히 다녔나 봅니다....
수치해석 하고 선형대수 과목 이수했는데...
--------
From Buenos Aires, Argentina
No sere feliz pero tengo computadora.... jaja
닥치고 Ubuntu!!!!!
To Serve My Lord Jesus
blog: http://sehoonpark.com.ar (블로그 주소 바꼈습니다)
--------
From Buenos Aires, Argentina
No sere feliz pero tengo computadora.... jaja
닥치고 Ubuntu!!!!!
To Serve My Lord Jesus
blog: http://sehoonpark.com.ar
http://me2day.net/sheep
댓글 달기