테일러 급수를 이용한 sin, cos 전개시....

gurunanak의 이미지


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

lifthrasiir의 이미지

수식을 잘못 넣으셨군요. 위키백과에서 정확한 수식을 찾아서 다시 코드를 짜 보시길 바랍니다. (코드를 다시 한 번 잘 살펴 보세요. :)

- 토끼군

elien의 이미지

일단 factorial 함수가 잘못되었습니다.

int fact(int fact_num)
{
	int y = 1;   // 초기값 1입니다.

	while (fact_num >= 1)
	{
		y = y * fact_num;
		fact_num--;
	}
	return y;
}

그리고 main 함수의 radian 값 입력부분이 잘못되었습니다.

    float radian;
    scanf("%f", &radian);

결정적으로 토끼군 님이 지적하신 것처럼 수식에 오류가 있구요,
그 오류는 차치하고서라도, 999 step 까지의 테일러 전개는 계산값의 overflow 가 일어나기 때문에 원하는 결과를 얻을 수 없습니다. (999! 을 생각해보세요; )
대략 [0, 3~5] 정도만 계산하여도 근사한 값을 얻을 수 있습니다.

훗, 못 믿겠나?

익명 사용자의 이미지


double sine(double radian)
{
      int i;
      double y=0;
      
      for(i=0;i<=3;i++)
      {
                y = y + pow(-1, i)/fact(2*i+1)*pow(radian, 2*i+1);
                }
      return y;
}

double cosine(double radian)
{
      int i;
      double y=1;
      
      for(i=0;i<=3;i++)
      {
                        y = y + pow(-1, i)/fact(2*i)*pow(radian, 2*i);
                        }
      return y;
}

수식을 참고하여 고쳐보았지만 계속 똑같은 값만 나오네요..

짧은 수식인데 왜 이리 오류가 나오는지 ㅠ.ㅠ

왜 그런건가요?

doldori의 이미지

double cosine(double radian) 
{ 
      int i; 
      double y=0;  // fixed
      
      for(i=0;i<=3;i++) 
      { 
                        y = y + pow(-1, i)/fact(2*i)*pow(radian, 2*i); 
                        } 
      return y; 
} 

fact()의 반환형도 double로 해야 할 것 같군요.
main()의 radian 값도 제대로 입력되는지 살펴보시고요.

익명 사용자의 이미지

cosine에서 y=0으로 시작하든지 i=1부터 시작하세요.
그리고.. PI=3.14159265... 이구요.

익명 사용자의 이미지

gurunanak wrote:

...
#define PI 3.148
...

이거 보면 어이없어할 분 몇분 계시겠네요 :twisted:

3.14192 소숫점 다섯자리는 상식
3.1415926535 10자리정도는 fortran프로그램 하도 짜도보면
(매크로가 없기땜에.. 물론 atan() 쓰기도 하지만..)
3.141592 65358979 42384626 이정도 이상은 geek

이상 딴지였슴다
:roll:

익명 사용자의 이미지

아.. scanf("%lf", &radian); 도.. 이게 크네.. -_-;

익명 사용자의 이미지

Anonymous wrote:

3.141592 65358979 42384626 이정도 이상은 geek

역태클 들어갑니다.
3.141592 65358979 32384626 입니다.

익명 사용자의 이미지

값이 정확한지는 잘 모르겟지만... 제 필요가 아니라 친구가 필요한 것이기 땜시.... ㅋㅋ

하여튼 이번에는 그럭저럭 잘 되는것 같네요... 감사합니다..

제가 공과대 생이 아닌지라... 파이값..... ㅡㅡㅋ 그런거 고등학교때 이후로 본적이 없어서... ^^

하여튼 감사합니다.... 덕분에 술값 벌었습니다 ^^;;;;;

익명 사용자의 이미지

Anonymous wrote:
Anonymous wrote:

3.141592 65358979 42384626 이정도 이상은 geek

역태클 들어갑니다.
3.141592 65358979 32384626 입니다.


YOU WIN !!
geoplab의 이미지

exp^(i*x) 값을 계산하여 real 값과 imaginary 값을 각각 구하면 cos(x) 값과 sin(x) 값을 구할 수 있으니 더 효율적이 되지 않을까요?

   exp(i*x)=1+i*x+(i*x)^2/2!+(i*x)^3/3!+...
           =cos(x)+i*sin(x)
에이쥬어의 이미지

3.141592 65358979 32384626 43383279 5

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.