Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

sin(x)와 cos(x) 값을 계산하는 C++ 프로그램 – 급수 전개로 직접 구현하기


각도가 입력값으로 주어졌을 때, 해당 각도에 대응하는 sin(x)와 cos(x)의 값을 계산하여 결과를 출력하는 것이 이번 예제의 목표입니다. 여기서는 단순히 math.h의 sin(), cos() 함수에 의존하는 것이 아니라, 급수 전개를 이용해 값을 직접 계산하는 방법을 살펴보겠습니다.

sin(x)란?

sin(x)는 가장 기본적인 삼각 함수 중 하나로, 주어진 각도에 대한 사인 값을 계산하는 데 사용됩니다. 수학적으로는 다음과 같은 매클로린 급수(Maclaurin series) 전개로 표현할 수 있습니다.

공식

$$\sin (x) = \displaystyle\sum\limits_{k=0}^\infty \frac{(-1)^{k}}{(2k+1)!}x^{2k+1}$$

cos(x)란?

cos(x) 역시 대표적인 삼각 함수로, 주어진 각도에 대한 코사인 값을 계산합니다. 다음과 같은 급수 전개를 통해 그 값을 구할 수 있습니다.

공식

$$\cos (x) = \displaystyle\sum\limits_{k=0}^\infty \frac{(-1)^{k}}{(2k)!}x^{2k}$$

아래 프로그램에 적용된 접근 방식은 다음과 같습니다.

  • sin(x)와 cos(x)를 계산할 각도 x의 값을 입력으로 받습니다.
  • 위에서 소개한 급수 공식을 sin(x)와 cos(x)에 각각 적용합니다.
  • 계산된 결과를 출력합니다.

알고리즘

START
Step 1-> sin 값을 계산하는 함수 선언
    void cal_sin(float n)
    float acc = 0.0001, denominator, sinx, sinval 선언 및 초기화
    n = n * (3.142 / 180.0) 설정 (도 → 라디안 변환)
    float temp = n 선언
    sinx = n 설정
    sinval = sin(n) 설정
    int i = 1 선언 및 초기화
    DO
        denominator = 2 * i * (2 * i + 1) 설정
        temp = -temp * n * n / denominator 설정
        sinx = sinx + temp 설정
        i = i + 1 설정
    WHILE(acc <= fabs(sinval - sinx))
    sinx 출력
Step 2-> cos 값을 계산하는 함수 선언
    void cal_cos(float n)
    float acc = 0.0001, temp, denominator, cosx, cosval 선언 및 초기화
    n = n * (3.142 / 180.0) 설정 (도 → 라디안 변환)
    temp = 1 설정
    cosx = temp 설정
    cosval = cos(n) 설정
    int i = 1 설정
    DO
        denominator = 2 * i * (2 * i - 1) 설정
        temp = -temp * n * n / denominator 설정
        cosx = cosx + temp 설정
        i = i + 1 설정
    WHILE(acc <= fabs(cosval - cosx))
    cosx 출력
Step 3-> main() 함수에서
    float n = 30 선언
    cal_sin(n) 호출
    n = 60 설정
    cal_cos(n) 호출
STOP

예제 코드

#include <iostream>
#include <math.h>
using namespace std;
// sin 값 계산
void cal_sin(float n) {
    float acc = 0.0001, denominator, sinx, sinval;
    n = n * (3.142 / 180.0);   // 라디안으로 변환
    float temp = n;
    sinx = n;
    sinval = sin(n);
    int i = 1;
    do {
        denominator = 2 * i * (2 * i + 1);
        temp = -temp * n * n / denominator;
        sinx = sinx + temp;
        i = i + 1;
    } while (acc <= fabs(sinval - sinx));
    cout<<sinx;
}
// cos 값 계산
void cal_cos(float n) {
    float acc = 0.0001, temp, denominator, cosx, cosval;
    n = n * (3.142 / 180.0); // 라디안으로 변환
    temp = 1;
    cosx = temp;
    cosval = cos(n);
    int i = 1;
    do {
        denominator = 2 * i * (2 * i - 1);
        temp = -temp * n * n / denominator;
        cosx = cosx + temp;
        i = i + 1;
    } while (acc <= fabs(cosval - cosx));
    cout<< cosx;
}
int main() {
    float n = 30;
    cout<<"value of Sin is : "; cal_sin(n);
cout<<"\n";
    n=60;
cout<<"value of Cos is : ";
cal_cos(n);
    return 0;
}

실행 결과

value of Sin is : 0.500061
value of Cos is : 0.499847

코드 설명

입력된 각도는 '도(deg)' 단위이므로, 먼저 3.142/180.0(≈π/180)을 곱해 라디안 값으로 변환합니다. 이후 첫 번째 항부터 시작해 부호가 교대로 바뀌는 급수 항을 차례로 더해 가며, 미리 정해둔 오차 허용 범위(acc = 0.0001)보다 라이브러리 함수 값(sin(n), cos(n))과의 차이가 작아지면 반복을 종료합니다. 마지막으로 누적된 근삿값을 화면에 출력합니다.

참고로 위 코드에서는 원주율을 3.142로 근사했기 때문에, 이론값(예: sin 30° = 0.5, cos 60° = 0.5)과 약간의 오차가 있는 결과가 출력됩니다. 더 높은 정확도가 필요하다면 cmath 헤더의 M_PI 상수처럼 더 정밀한 원주율 값을 사용하는 것이 좋습니다.