테일러 급수를 이용한 sin, cos 전개시....
글쓴이: gurunanak / 작성시간: 월, 2005/09/05 - 12:46오전
#include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.148 int fact(int fact_num) { double y=0; while(fact_num>=1) { y = y*fact_num; fact_num--; } } double sine(double radian) { int i; double y=0; for(i=1;i<=999;i++) { y = y + sin(2*PI*i/2)*pow(radian, i)/fact(i); } return y; } double cosine(double radian) { int i; double y=1; for(i=1;i<=999;i++) { y = y + cos(2*PI*i/2)*pow(radian, i)/fact(i); } return y; } int main() { double radian; scanf("%d", radian); printf("sin = %ef\n", sine(radian)); printf("cos = %ef\n", cosine(radian)); system("PAUSE"); return 0; }
이렇게 소스를 작성했는데.... 자꾸만 같은 값이 나오는군요
어찌된 일인지.... 3년만에 하려니 머가 먼지 도통 모르겟구...
난감합니다.. 왜 그런지 이유좀 알려 주세요~[/code]
Forums:
Re: 테일러 급수를 이용한 sin, cos 전개시....
수식을 잘못 넣으셨군요. 위키백과에서 정확한 수식을 찾아서 다시 코드를 짜 보시길 바랍니다. (코드를 다시 한 번 잘 살펴 보세요. :)
- 토끼군
일단 factorial 함수가 잘못되었습니다.[code:1]int f
일단 factorial 함수가 잘못되었습니다.
그리고 main 함수의 radian 값 입력부분이 잘못되었습니다.
결정적으로 토끼군 님이 지적하신 것처럼 수식에 오류가 있구요,
그 오류는 차치하고서라도, 999 step 까지의 테일러 전개는 계산값의 overflow 가 일어나기 때문에 원하는 결과를 얻을 수 없습니다. (999! 을 생각해보세요; )
대략 [0, 3~5] 정도만 계산하여도 근사한 값을 얻을 수 있습니다.
훗, 못 믿겠나?
수식을 고쳐 봤는데도 도통 이상하네요.
수식을 참고하여 고쳐보았지만 계속 똑같은 값만 나오네요..
짧은 수식인데 왜 이리 오류가 나오는지 ㅠ.ㅠ
왜 그런건가요?
[code:1]double cosine(double radian&
fact()의 반환형도 double로 해야 할 것 같군요.
main()의 radian 값도 제대로 입력되는지 살펴보시고요.
그건..
cosine에서 y=0으로 시작하든지 i=1부터 시작하세요.
그리고.. PI=3.14159265... 이구요.
Re: 테일러 급수를 이용한 sin, cos 전개시....
이거 보면 어이없어할 분 몇분 계시겠네요 :twisted:
3.14192 소숫점 다섯자리는 상식
3.1415926535 10자리정도는 fortran프로그램 하도 짜도보면
(매크로가 없기땜에.. 물론 atan() 쓰기도 하지만..)
3.141592 65358979 42384626 이정도 이상은 geek
이상 딴지였슴다
:roll:
아.. scanf("%lf", &radian); 도.. 이게 크네
아.. scanf("%lf", &radian); 도.. 이게 크네.. -_-;
Re: 테일러 급수를 이용한 sin, cos 전개시....
역태클 들어갑니다.
3.141592 65358979 32384626 입니다.
감사합니다... ^^
값이 정확한지는 잘 모르겟지만... 제 필요가 아니라 친구가 필요한 것이기 땜시.... ㅋㅋ
하여튼 이번에는 그럭저럭 잘 되는것 같네요... 감사합니다..
제가 공과대 생이 아닌지라... 파이값..... ㅡㅡㅋ 그런거 고등학교때 이후로 본적이 없어서... ^^
하여튼 감사합니다.... 덕분에 술값 벌었습니다 ^^;;;;;
Re: 테일러 급수를 이용한 sin, cos 전개시....
YOU WIN !!
exp^(i*x) 값을 계산하여 real 값과 imaginary 값을 각
exp^(i*x) 값을 계산하여 real 값과 imaginary 값을 각각 구하면 cos(x) 값과 sin(x) 값을 구할 수 있으니 더 효율적이 되지 않을까요?
으흠.
3.141592 65358979 32384626 43383279 5
댓글 달기