수학 계산 snippet
글쓴이: Prentice / 작성시간: 월, 2005/06/06 - 12:29오후
http://en.wikipedia.org/wiki/Heptadecagon
17각형 작도법에 대한 얘기를 보고, 확인을 해보고 싶어서 검산을 해봤습니다.
#include <stdio.h> #include <math.h> int main(void) { long double calced; long double summed; long double root17; long double root_neg_34; long double root_pos_34; long double root_triple; root17 = sqrt(17); root_neg_34 = sqrt(34-2*root17); root_pos_34 = sqrt(34+2*root17); root_triple = sqrt(17+3*root17-root_neg_34-2*root_pos_34); calced = 16 * cos((2*M_PI)/17); summed = -1 + root17 + root_neg_34 + 2*root_triple; printf("Calced: %.99Lf\n", calced); printf("Summed: %.99Lf\n", summed); return 0; }
결과:
AMD64 pure64 Calced: 14.919555670469692998381106008309870958328247070312500000000000000000000000000000000000000000000000000 Summed: 14.919555670469692998381106008309870958328247070312500000000000000000000000000000000000000000000000000 AMD64 chroot x86 Calced: 14.919555670469692899501867877631866576848551630973815917968750000000000000000000000000000000000000000 Summed: 14.919555670469692998381106008309870958328247070312500000000000000000000000000000000000000000000000000 AMD64 cygwin x86 Calced: 14.919555670469692901236591353608673671260480000000000000000000000000000000000000000000000000000000000 Summed: 14.919555670469692998381106008309870958328250000000000000000000000000000000000000000000000000000000000
#!/usr/bin/python import math; root17 = math.sqrt(17); root_neg_34 = math.sqrt(34-2*root17); root_pos_34 = math.sqrt(34+2*root17); root_triple = math.sqrt(17+3*root17-root_neg_34-2*root_pos_34); calced = 16 * math.cos((2*math.pi)/17); summed = -1 + root17 + root_neg_34 + 2*root_triple; print calced; print summed;
C에서 고정밀도 연산을 하려면 어떻게 해야 할지 궁금합니다. 다음에 시간이 생기면 먼저 python에서 어떻게 하는지를 알아볼 생각입니다.
Forums:
C에서 고정밀도 연산을 하려면...long double 같은 형을 쓰
C에서 고정밀도 연산을 하려면...
long double 같은 형을 쓰지 말고 수치 class를 직접 정의해서 더큰 bit로 곱셈 나눗셈 덧셈 뺄셈 그리고 필요한 다른 연산들을 다 구현해줘야겠지요 -_-;;
제가알고있는 곱셈 라이브러리중 하나인데 혹시 참고가 되실지도..
http://cr.yp.to/zmult.html
프로그래밍에 대해서는 잘 모르지만 코멘트를 하나 하고 싶은게 있습니다.
프로그래밍에 대해서는 잘 모르지만 코멘트를 하나 하고 싶은게 있습니다.
sine함수와 제곱근 계산이 모두 근사(approximation)이기 때문에
동일한 compiler 안에서 sine 함수를 직접계산한 것과 제곱근을 이용해
계산한 결과 사이의 차이점은 먼저 이 함수들이 기반한 알고리즘의 오차를
먼저 알아보는게 좋지 않을까요? 파이(pi) 역시 근사값이지요.
구현 방법상의 오차가 long double type에서
표현할 수 있는 값보다 작으면 kkb110님의 말씀처럼 새로운 변수형을 정의해서
계산하는게 필요하겠지만 반대의 경우라면 더 오차가 더 작은 계산 방법(함수)을
이용하는 게 중요할 것 같네요.
파이썬 2.4에 추가된 Decimal 모듈을 사용한 코드입니다. 좀 느리
파이썬 2.4에 추가된 Decimal 모듈을 사용한 코드입니다. 좀 느리긴 합니다. -_-;;;
파이썬 레퍼런스에 있는 recipe를 좀 참고했습니다. (sqrt 함수는 제가 만들었습니다만)
결과:
- 토끼군
17각형 작도법... @.@ 놀랍군요. 그에 얽힌 얘기를 읽어보니 가우스
17각형 작도법... @.@ 놀랍군요. 그에 얽힌 얘기를 읽어보니 가우스가 19살때
일반적으로 (2^(2^n)+1)각형의 작도가 가능하다는 것을 증명했다고 하는데
그거 참... 말이 안나옵니다.
토끼군님이 작성하신 sqrt()는 Newton-Rhapson법을 쓰신 것 같군요. 제가 파이썬은
모르지만 대충 눈치를 보아하니 임의의 정밀도 계산이 가능한가 봅니다. 그런데
계산 시작하기 전에 정밀도를 2 올리는 이유는 뭔가요?
[quote="doldori"]17각형 작도법... @.@ 놀랍군요. 그
Newton('s) method를 Newton-Rhapson method라고도 하는 군요. 정밀도를 올리는 이유는, 수렴 기준이 정밀도 안에서 수치가 변하지 않는 경우인데 이러다 보면 맨 마지막 자리가 잘못 나올 가능성이 있기 때문입니다. (미리 두 개 더 계산하고 절삭하면 별 문제 없겠죠 -,.-)
그나저나 pi() 함수가 좀 느린 것 같군요. 무슨 전개식인지 모르겠는데(recipe에서 가져 와서 -_-;) pi = 16arctan(1/5) - 4arctan(1/239)를 사용하니 수렴 속도가 꽤 개선되었습니다. pi 함수를 다음으로 고쳐 보세요. (다른 전개식도 많이 테스트해 봤는데 기본 연산만 쓰면서 속도 빠른 게 이것 정도더라는)
- 토끼군
댓글 달기