Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. C言語辞典
  3. sin() / cos() / tan() / asin() / acos() / atan2()

sin() / cos() / tan() / asin() / acos() / atan2()

三角関数および逆三角関数です。『<math.h>』に定義されており、引数・戻り値の角度の単位はすべてラジアンです。コンパイル時に『-lm』リンクオプションが必要な場合があります。

構文
// 正弦(サイン)を返します。引数はラジアン。
double sin(double x);

// 余弦(コサイン)を返します。引数はラジアン。
double cos(double x);

// 正接(タンジェント)を返します。引数はラジアン。
double tan(double x);

// 逆正弦(アークサイン)を返します。戻り値は [-π/2, π/2] のラジアン。
// 引数は [-1.0, 1.0] の範囲が必要です。
double asin(double x);

// 逆余弦(アークコサイン)を返します。戻り値は [0, π] のラジアン。
// 引数は [-1.0, 1.0] の範囲が必要です。
double acos(double x);

// y/x の逆正接(アークタンジェント)を返します。戻り値は [-π, π] のラジアン。
// x=0 の場合も正しく計算でき、象限を判定します。
double atan2(double y, double x);
関数一覧
関数概要引数の範囲
sin()正弦(サイン)を返します。制限なし(ラジアン)
cos()余弦(コサイン)を返します。制限なし(ラジアン)
tan()正接(タンジェント)を返します。制限なし(±π/2 付近で無限大)
asin()逆正弦(アークサイン)を返します。[-1.0, 1.0]
acos()逆余弦(アークコサイン)を返します。[-1.0, 1.0]
atan2()2引数の逆正接を返します。象限を正しく判定します。制限なし(x=0 も可)
サンプルコード
#include <stdio.h>
#include <math.h>

// 度数法(°)をラジアンに変換するマクロです。
#define DEG_TO_RAD(deg) ((deg) * M_PI / 180.0)

int main(void) {
    // sin, cos, tan の基本的な使い方です(30度)。
    double deg = 30.0;
    double rad = DEG_TO_RAD(deg); // ラジアンに変換します。
    printf("sin(30°) = %.6f\n", sin(rad)); // 0.5 に近い値が出力されます。
    printf("cos(30°) = %.6f\n", cos(rad)); // √3/2 ≈ 0.866025 が出力されます。
    printf("tan(30°) = %.6f\n", tan(rad)); // 1/√3 ≈ 0.577350 が出力されます。

    // atan2 で座標から角度を求めます(ベクトルの方向計算に便利)。
    double x = 1.0, y = 1.0; // 45度方向のベクトルです。
    double angle_rad = atan2(y, x);
    double angle_deg = angle_rad * 180.0 / M_PI; // ラジアンを度数法に変換します。
    printf("atan2(1, 1) = %.1f°\n", angle_deg); // 『45.0°』と出力されます。

    // asin で逆算します。sin(30°) ≈ 0.5 なので、asin(0.5) ≈ 30° になります。
    double val = 0.5;
    double result_deg = asin(val) * 180.0 / M_PI;
    printf("asin(0.5) = %.1f°\n", result_deg); // 『30.0°』と出力されます。

    // 3-4-5 の直角三角形で斜辺と角度を求めます。
    double a = 3.0, b = 4.0;
    double hyp = sqrt(a * a + b * b); // 斜辺 = 5.0
    double angle = atan2(b, a) * 180.0 / M_PI; // 底辺 a に対する角度
    printf("斜辺 = %.1f、角度 = %.2f°\n", hyp, angle);
    // 『斜辺 = 5.0、角度 = 53.13°』と出力されます。

    return 0;
}
概要

C言語の三角関数はすべてラジアンを単位として使います。度数法(°)で角度を与える場合は、事前に『deg × π / 180』の式でラジアンに変換してください。逆に、ラジアンから度数法に戻す場合は『rad × 180 / π』を使います。π の値は『M_PI』マクロ(多くの環境で利用可能)を使うのが一般的です。

『atan2(y, x)』は1引数の『atan(y/x)』と異なり、x が 0 の場合でも正しく計算でき、象限(0〜360度のどの範囲か)を正しく判定します。ベクトルの角度計算には atan() ではなく atan2() を使用してください。

asin() と acos() の引数の範囲は [-1.0, 1.0] です。範囲外の値を渡すと NaN が返ります。浮動小数点演算の誤差で範囲をわずかに超えることがあるため、入力前に確認が必要な場合があります。

その他の数学関数については『sqrt() / pow() / fabs()』や『log() / exp()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。