HOWTO · C++

C++의 삼각 함수

이 기사에서는 C++에서 STL의 삼각 함수를 활용하는 방법을 보여줍니다.

이 페이지의 내용

C++ 표준 <cmath> 헤더는 사인, 코사인, 탄젠트, 역삼각 함수와 쌍곡선 함수를 제공합니다. 일반 삼각 함수는 라디안 단위의 각을 입력으로 받아 부동소수점 값을 반환합니다. 표준 라이브러리 함수를 사용한다는 점을 분명히 하려면 std:: 한정자를 붙인 이름을 사용하세요.

라디안 단위 각에 std::sin, std::cos, std::tan 사용하기

각의 사인, 코사인, 탄젠트 값을 계산하려면 std::sin(angle), std::cos(angle), std::tan(angle)을 호출하세요. 함수 선언을 사용하려면 <cmath>를 포함해야 합니다. 이 함수들은 부동소수점 형식별 오버로드를 제공하며, 반환값은 해당 부동소수점 형식을 따릅니다(정수 인수는 부동소수점 오버로드에 맞게 변환됩니다).

다음 예제를 실행하세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

#include <cmath>
#include <iomanip>
#include <iostream>

int main() {
  const double angle = 1.0; // radians
  std::cout << std::fixed << std::setprecision(6)
            << "sin(" << angle << ") = " << std::sin(angle) << '\n'
            << "cos(" << angle << ") = " << std::cos(angle) << '\n'
            << "tan(" << angle << ") = " << std::tan(angle) << '\n';
}

이 실행에서 관찰된 출력은 다음과 같습니다.

sin(1.000000) = 0.841471
cos(1.000000) = 0.540302
tan(1.000000) = 1.557408

인수는 1라디안입니다. std::fixed와 std::setprecision(6)은 반환된 각 값을 소수점 아래 여섯 자리까지 표시합니다.

역삼각 함수로 각도 구하기

사인값에서 각을 구하려면 std::asin(x), 코사인값에서는 std::acos(x), 탄젠트값에서는 std::atan(x)을 사용하세요. 반환값은 라디안입니다. asin은 -1부터 1까지의 값을 받아 [-π/2, π/2] 범위의 각을 반환합니다. acos도 같은 입력 범위를 사용하며 [0, π] 범위의 각을 반환합니다. atan은 유한한 실수라면 어떤 값이든 받아 (-π/2, π/2) 범위의 각을 반환합니다.

두 좌표로 방향을 나타낼 때는 std::atan2(y, x)를 사용하세요. atan(y / x)와 달리 두 인수의 부호를 모두 사용해 사분면을 결정하며, 좌표를 먼저 나눌 필요도 없습니다. 결과는 라디안이며 일반적으로 [-π, π] 범위에 있습니다(끝점이 어떻게 표현되는지는 부호 있는 0 인수에 따라 달라질 수 있습니다).

역함수는 원래 값이 나올 수 있는 모든 각이 아니라 주값(principal angle)을 반환합니다. 예를 들어 여러 각이 같은 사인값을 가지므로, asin만으로 주값 범위를 벗어난 원래 각을 알아낼 수는 없습니다. 최종 각을 선택할 때는 문제의 기하학적 맥락과 사분면 정보를 함께 고려하세요.

쌍곡선 값에는 쌍곡선 함수 사용하기

std::sinh, std::cosh, std::tanh는 쌍곡선 사인, 코사인, 탄젠트 값을 계산합니다. 이 함수들은 지수 함수로 정의되며 std::sin, std::cos, std::tan을 대신할 수 없습니다. 입력은 원 위의 각이 아니라 실수이고, 함수의 값 범위도 다릅니다. 예를 들어 cosh(x)는 항상 1 이상인 반면, 일반 코사인값은 -1부터 1 사이입니다.

역쌍곡선 함수는 std::asinh, std::acosh, std::atanh입니다. 실수 입력의 정의역은 서로 다릅니다. asinh는 모든 실수를 입력으로 받고, acosh는 1 이상인 값을, atanh는 -1과 1 사이의 값을 양 끝점 없이 받습니다. 일반 삼각 함수 이름 앞에 a를 붙이는 방식으로 이름을 추측하지 말고, 쌍곡선 관계에는 이 함수들을 사용하세요.

각도 단위, 정의역, 부동소수점 결과 처리하기

C++ <cmath>의 삼각 함수는 라디안을 입력으로 받습니다. 도 단위 값은 radians = degrees * π / 180으로 변환하세요. 예를 들어 90도는 π/2 라디안입니다. 이식성 있는 C++ 코드에서 π를 얻으려면 std::acos(-1.0)을 사용하거나 필요한 상수를 직접 정의하세요. M_PI는 표준 C++ 이름이 아닙니다.

역함수의 입력은 해당 실수 정의역 안에 있어야 합니다. 값이 정의역을 벗어났을 때 검사하거나 범위 안으로 제한하는 것은 애플리케이션의 수학적 요구에 맞는 경우에만 하세요. [-1, 1] 범위를 아주 조금 벗어난 값을 제한하면 누적된 반올림 오차를 보정할 수 있지만, 실제로 범위를 벗어난 입력을 숨겨서는 안 됩니다. 정의역 오류의 처리는 C++ 수학 라이브러리의 오류 처리 방식과 구현에 따라 달라지며, 이는 정의되지 않은 동작이 아닙니다. 유효한 결과와 수학 오류를 구분해야 한다면 math_errhandling을 확인하고 해당 구현이 지원하는 관련 오류 표시를 점검하세요.

std::tan은 π/2의 홀수 배수에 가까워질수록 값이 매우 커지며, 수학적으로 그 지점에서는 유한한 실수값이 없습니다. 부동소수점으로 극점을 근사하면 명확한 오류 신호 대신 큰 유한값이 나올 수 있습니다. 극점에 가까운 입력이 중요하다면 애플리케이션의 요구사항과 허용 오차에 맞춰 입력을 검사하세요.

부동소수점 계산은 근삿값입니다. std::sin(std::acos(-1.0)) 같은 값은 0에 가깝지만 정확히 0이 아닐 수 있습니다. 계산값을 비교할 때는 정확한 일치 여부 대신 애플리케이션에 적합한 허용 오차를 사용하세요. 일반적인 계산에는 double을 사용하고, 더 높은 정밀도와 지원이 필요한 경우에만 더 넓은 형식을 선택하세요. 직접 근사 함수를 작성하기보다 표준 라이브러리를 사용하고, 계산값을 다시 사용할 때는 저장해 두세요.