3^0.5를 소수점 이하 100만 자리 까지 구하고 싶습니다.

peacepiece의 이미지

안녕하세요.
C 언어로 3의 0.5승 또는 √3을 소수점 이하 100만 자리 까지 계산하고 싶습니다.
pow 함수로는 소수점 이하 16자리 까지 밖에 안되더군요. ^^;
큰자리수의 표현을 위해서 int 배열을 주판처럼 만들어서 계산 할 생각인데...
당췌 계산하는 방법을 모르겠습니다.

질문 1 : 3의 0.5승을 기본연산(+-*/)으로 계산 할 수는 없나요??

질문 2 : pow 함수의 소스 코드를 좀 봤으면 좋겠는데 어디서 볼 수 있는지 아시는분 있으시면 알려주시기 바랍니다.

ysy05의 이미지

위키피디아에 질문 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

feanor의 이미지

뉴턴법을 쓰시면 됩니다. 빨리 수렴하고, 불안정성이 있지만 제곱근 구하는 경우에는 상관없습니다.

자세한 내용은 위키백과를 참조하세요.
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가 아닌 다른 실수로 제곱하는 경우 도함수를 다시 구해서 뉴턴법을 적용하면 됩니다.

feanor의 이미지

GMPY 모듈(http://gmpy.sourceforge.net/)을 써서 파이썬으로 작성해 보았습니다. 전체 20줄이고, 100만자리까지 구하는 데 제 컴퓨터에서 3분 33초 걸렸습니다. (별 의미는 없지만, 초당 4700자리씩입니다.)

100자리까지 구할 때 다음과 같이 실행하시면 됩니다.
python sqrt.py 100

댓글 첨부 파일: 
첨부파일 크기
Plain text icon sqrt.py288바이트
modestcode의 이미지

속도라면 이미 있는 것을 활용하는 것이 좋을 듯합니다.

x=gmpy.mpf(n, p)
print gmpy.fsqrt(x)

3초쯤 걸리더군요. C버젼과 크게 차이나지 않는 것 같습니다.
feanor의 이미지

PARI/GP로 하니까 62초만에 됩니다. 데비안에서는 apt-get install pari-gp 로 설치하고,

\p 1000000
allocatemem(15000000)
print(sqrt(3))
\q

위 코드를 sqrt.gp 파일에 저장한 다음에 gp sqrt.gp 와 같이 실행하면 됩니다. (루트 3을 100만자리까지 15M 메모리로 구함)

cjh의 이미지

bc로 해 보았는데...

echo "scale=1000000; sqrt(3)" | bc

17시간 15분 걸렸습니다. (P-IV 2.8g x 1) 메모리는 거의 안쓰는것 같더군요.

--
익스펙토 페트로눔

--
익스펙토 페트로눔

modestcode의 이미지

첨에 17분인줄 알았네요, 돌리다가 안 되네 하고 멈췄는데......대단하십니다. 끝까지 돌리시다니.

aero의 이미지

perl -e 'use Math::BigFloat lib=>GMP;print Math::BigFloat->new(3)->bsqrt(1000000);'

perl Math::BigFloat 모듈은 내부적으로 GMP혹은 Pari 라이브러리가 설치되어 있으면
그것을 사용하고 혹은 직접지정 없으면 pure perl구현 라이브러리를 사용하는 구조입니다.
GMP로 지정하고 돌리니 몇초안에 끝나버리네요.
pure perl구현은 답이 언제 나올지 몰라 중간에 중지 시켜버렸습니다.

sheep의 이미지

다들 대가시군요...

모르는 제가 한심해 보입니다...

대학교는 괜히 다녔나 봅니다....

수치해석 하고 선형대수 과목 이수했는데...

--------
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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.