
C言語のきほん|三角関数を使う(sin、cos、tan)
角度を計算に変えると、動きや形が見えてくる。sin、cos、tan を使って三角関数の基本をやさしく身につけよう
C言語で数値計算をしていると、長さや面積だけでなく、角度に関係する計算をしたくなる場面が出てきます。
たとえば、物体の移動方向を求めたり、斜めの長さを計算したり、座標を回転させたり、波のような動きを表したりするときです。
そんなときに活躍するのが、三角関数の sin、cos、tan です。
- sin は正弦
- cos は余弦
- tan は正接
を求める関数です。
数学の授業で見たことがある方も多いと思いますが、C言語ではこれらを関数として直接使えるので、三角比を使った計算をプログラムの中で簡潔に書けます。
ただし、ここでとても大事な注意があります。
C言語の三角関数は、角度をラジアン単位で渡す必要があるという点です。
ふだん私たちは 30度、45度、90度 のように「度」で角度を考えることが多いですが、sin や cos や tan にそのまま 90 を渡しても、「90度」としては扱われません。
そこで、使う前に
- 度 → ラジアン
- ラジアン → 度
の変換を理解しておくことがとても大切です。
この記事では、sin、cos、tan の基本的な使い方に加えて、
- ラジアンとは何か
- 度とラジアンの変換方法
- 0度から180度までの三角関数の動き
- tan が 90度付近で大きくなる理由
- 実際のプログラムでどう使うか
まで、順番にやさしく見ていきます。
三角関数は最初は少しとっつきにくく感じるかもしれません。
でも、角度と座標の関係がわかってくると、図形、物理、ゲーム、シミュレーションなど、いろいろな場面で使えるとても便利な道具になります。
ここで基本をしっかり押さえていきましょう。
三角関数とは
三角関数は、角度に基づいた計算を行うための関数です。
C言語では math.h に用意されています。
使うときは、まず次のヘッダファイルをインクルードします。
#include <math.h>今回扱う関数は次の3つです。
| 関数名 | 内容 |
|---|---|
| sin | 正弦を求める |
| cos | 余弦を求める |
| tan | 正接を求める |
この3つは、三角関数の基本としてとてもよく使われます。
角度はラジアンで指定する
ここが最重要ポイントです。
C言語の sin、cos、tan は、角度をラジアンで受け取ります。
つまり、90度をそのまま 90.0 として渡すのではなく、ラジアンに変換してから渡す必要があります。
度からラジアンへの変換
ラジアン = 度 × (π / 180)ラジアンから度への変換
度 = ラジアン × (180 / π)たとえば、90度をラジアンに変換すると、
90 × (π / 180) = π / 2になります。
そのため、90度の sin を求めるときは、次のように書きます。
double y;
y = sin(90.0 * 3.14159265358979323846 / 180.0);ラジアンのイメージをつかもう
ラジアンは最初は少しなじみにくいですが、よく使う角度との対応を表で見ておくと理解しやすいです。
| 度 | ラジアン |
|---|---|
| 0度 | 0 |
| 30度 | π / 6 |
| 45度 | π / 4 |
| 60度 | π / 3 |
| 90度 | π / 2 |
| 180度 | π |
| 360度 | 2π |
この表を見ておくと、三角関数でよく出てくる角度の感覚がつかみやすくなります。
sin 関数とは
sin は、ラジアンで与えた角度の正弦を求める関数です。
関数宣言
#include <math.h>
double sin(double x);機能
x ラジアンの正弦を計算します。
返却値
正弦値を返します。
使用例
double y;
y = sin(90.0 * 3.14159265358979323846 / 180.0);この場合、90度をラジアンに変換してから sin に渡しているので、結果は 1.0 になります。
cos 関数とは
cos は、ラジアンで与えた角度の余弦を求める関数です。
関数宣言
#include <math.h>
double cos(double x);機能
x ラジアンの余弦を計算します。
返却値
余弦値を返します。
使用例
double y;
y = cos(90.0 * 3.14159265358979323846 / 180.0);この場合、結果は 0.0 に近い値になります。
tan 関数とは
tan は、ラジアンで与えた角度の正接を求める関数です。
関数宣言
#include <math.h>
double tan(double x);機能
x ラジアンの正接を計算します。
返却値
正接値を返します。
使用例
double y;
y = tan(45.0 * 3.14159265358979323846 / 180.0);この場合、45度の正接なので結果は 1.0 になります。
sin、cos、tan の基本値
よく使う角度について、結果を表で見てみましょう。
| 角度 | sin | cos | tan |
|---|---|---|---|
| 0度 | 0.0 | 1.0 | 0.0 |
| 30度 | 0.5 | 約0.866 | 約0.577 |
| 45度 | 約0.707 | 約0.707 | 1.0 |
| 60度 | 約0.866 | 0.5 | 約1.732 |
| 90度 | 1.0 | 0.0 | 非常に大きい値 |
この表から、
- sin は 90度で 1.0
- cos は 0度で 1.0、90度で 0.0
- tan は 45度で 1.0
という基本が見えてきます。
tan が 90度で大きくなる理由
tan は、理論上 90度で定義できません。
実際には、90度に近づくほど非常に大きな値になります。
そのため、C言語で
tan(90度相当のラジアン)を計算すると、環境によっては非常に大きな数が表示されます。
これは計算が間違っているのではなく、浮動小数点数で近似的に扱っているためです。
90度ちょうどでは無限大のような振る舞いになるので、表示上は巨大な値になると理解しておくとよいです。

この図では、三角関数が角度 θ に対応して計算されることを表しています。
また、C言語では角度をラジアンで渡す必要があるため、度で考えた角度をそのまま使わず、まずラジアンに変換してから sin、cos、tan に渡すことが大切だとわかります。
0度から180度までの値を表にするプログラム
0度から180度まで30度おきに sin、cos、tan を求めるプログラムです。
ファイル名:12_13_1.c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
int main(void)
{
double degree;
double radian;
double s, c, t;
printf(" 角度 sin cos tan\n");
for (degree = 0.0; degree <= 180.0; degree += 30.0) {
/* 度をラジアンに変換する */
radian = degree * PI / 180.0;
/* 三角関数の値を求める */
s = sin(radian);
c = cos(radian);
t = tan(radian);
printf("%6.1f %11.5f %11.5f %11.5f\n", degree, s, c, t);
}
return 0;
}このプログラムのポイント
このプログラムで特に大切なのは、次の部分です。
π を定義している
#define PI 3.14159265358979323846ラジアン変換で π が必要なので、マクロとして定義しています。
処理系によっては M_PI が使えることもありますが、移植性を考えると自分で PI を定義する方法がわかりやすいです。
度をラジアンに変換している
radian = degree * PI / 180.0;ここが三角関数を使うときの基本です。
sin、cos、tan は degree ではなく radian を使って計算しています。
tan の値に注意する
90度では tan が非常に大きな値になります。
これは理論的には無限大に向かうためです。
実行イメージ
出力の一例は、次のようになります。
角度 sin cos tan
0.0 0.00000 1.00000 0.00000
30.0 0.50000 0.86603 0.57735
60.0 0.86603 0.50000 1.73205
90.0 1.00000 0.00000 大きな値
120.0 0.86603 -0.50000 -1.73205
150.0 0.50000 -0.86603 -0.57735
180.0 0.00000 -1.00000 -0.00000浮動小数点数の誤差について
三角関数では、計算結果が理論上ぴったり 0.0 や 1.0 になるように見えても、内部ではごく小さな誤差が出ることがあります。
たとえば、cos(90度) は理論上 0 ですが、実際には
- 0.000000 に非常に近い小さな値
- 表示上は 0.00000
になることがあります。
これは浮動小数点数の性質によるものです。
そのため、三角関数の結果を厳密に == 0 で比較するのは注意が必要です。
実践問題
平面上の2点 (x1, y1) と (x2, y2) の中点を求め、その点から原点 (0, 0) までの距離を計算するプログラムを作成してください。
距離は次の式を使います。
距離 = √(x² + y²)
解答例
ファイル名:12_13_2.c
#include <stdio.h>
#include <math.h>
int main(void)
{
double x1, y1, x2, y2;
double mx, my, distance;
printf("1つ目の点の座標(x1, y1)> ");
scanf("%lf %lf", &x1, &y1);
printf("2つ目の点の座標(x2, y2)> ");
scanf("%lf %lf", &x2, &y2);
mx = (x1 + x2) / 2.0;
my = (y1 + y2) / 2.0;
distance = sqrt(mx * mx + my * my);
printf("中点は (%.2f, %.2f) です。\n", mx, my);
printf("中点から原点までの距離は %.2f です。\n", distance);
return 0;
}解説
この問題では三角関数そのものは使いませんが、座標と距離の関係を扱う練習としてよい問題です。
平方根の計算に sqrt を使っています。
座標計算は後で sin や cos と組み合わせると、さらに応用しやすくなります。
実践問題
直角三角形において、斜辺の長さ c と角度 A を入力し、底辺の長さと高さを求めるプログラムを作成してください。
角度 A は度単位で入力し、計算には cos と sin を使ってください。
底辺 = c × cos(A)
高さ = c × sin(A)
解答例
ファイル名:12_13_3.c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
int main(void)
{
double c, degree, radian;
double base, height;
printf("斜辺の長さを入力してください> ");
scanf("%lf", &c);
printf("角度A(度単位)を入力してください> ");
scanf("%lf", °ree);
radian = degree * PI / 180.0;
base = c * cos(radian);
height = c * sin(radian);
printf("底辺の長さは %.6f です。\n", base);
printf("高さは %.6f です。\n", height);
return 0;
}解説
この問題では、角度をラジアンに変換してから cos と sin を使っています。
三角関数が「角度から長さの比を求める」計算に使えることがよくわかる問題です。
実践問題
速さ v と進行方向の角度 θ を入力し、x方向の速さと y方向の速さを求めるプログラムを作成してください。
角度は度単位で入力するものとします。
vx = v × cos(θ)
vy = v × sin(θ)
解答例
ファイル名:12_13_4.c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
int main(void)
{
double v, degree, radian;
double vx, vy;
printf("速さを入力してください> ");
scanf("%lf", &v);
printf("進行方向の角度(度単位)を入力してください> ");
scanf("%lf", °ree);
radian = degree * PI / 180.0;
vx = v * cos(radian);
vy = v * sin(radian);
printf("x方向の速さ: %.2f\n", vx);
printf("y方向の速さ: %.2f\n", vy);
return 0;
}解説
この問題では、1つの速さを x方向と y方向に分解しています。
物理やゲームプログラミングでよく出てくる考え方で、三角関数の実用例としてとても重要です。
実践問題
半径 200 の円周上を点が移動するとします。
中心は座標 (300, 300) とし、入力した角度の位置にある点の座標 (x, y) を求めるプログラムを作成してください。
角度は度単位で入力し、小数点以下は四捨五入して整数で表示してください。
座標の式は次の通りです。
x = 中心x + 半径 × cos(θ)
y = 中心y + 半径 × sin(θ)
解答例
ファイル名:12_13_5.c
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
int main(void)
{
double degree, radian;
double x, y;
int ix, iy;
printf("角度(度単位)を入力してください> ");
scanf("%lf", °ree);
radian = degree * PI / 180.0;
x = 300.0 + 200.0 * cos(radian);
y = 300.0 + 200.0 * sin(radian);
ix = (int)round(x);
iy = (int)round(y);
printf("座標は (%d, %d) です。\n", ix, iy);
return 0;
}解説
この問題は、三角関数を使って角度から座標を求める練習です。
sin と cos の非常に代表的な使い方で、円運動やアニメーションの基礎にもつながります。
最後に round を使って整数座標へ変換している点もポイントです。
M_PI について
環境によっては、π を表す M_PI というマクロが使えることがあります。
#include <math.h>のあとで、そのまま使える処理系もあります。
ただし、M_PI は標準Cで必須とされているわけではないため、使えない環境もあります。
そのため、教材や移植性を重視するコードでは、次のように自分で定義しておく方法がわかりやすいです。
#define PI 3.14159265358979323846三角関数を使うときの心構え
三角関数を使うときは、次の点を意識すると整理しやすいです。
| ポイント | 内容 |
|---|---|
| math.h が必要 | sin、cos、tan を使う準備をする |
| 角度はラジアン | 度のまま渡さない |
| π が必要 | ラジアン変換に使う |
| tan は 90度に注意 | 非常に大きな値になる |
| 誤差に注意 | 浮動小数点数なのでぴったりにならないことがある |
三角関数は、角度と長さ、角度と座標、角度と動きの関係をつなぐ、とても重要な道具です。
sin、cos、tan を使えるようになると、図形の計算だけでなく、物体の動きや位置の計算など、プログラムで表現できる世界が大きく広がります。
