C言語関数:sin





C言語のページでは、次の内容を解説しております。
C言語の入門講座  C言語の文法を中心に、基本的な関数などの解説をしています。
C言語ケーススタディ  C言語での実践的なプログラミングについて解説をしています。
C言語の関数リファレンス  C言語で用意されている関数を解説しています。
C言語で3次元動画プログラム  C言語で3次元タートルグラフィックを使用した3次元の動画プログラムの作成例です。
C言語の検定試験  C言語の文法に関する検定試験を実施することができます。
C言語でゲーム作成  C言語を使用したゲームの作り方を解説したページも用意しております。



2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。




■sin
正弦の計算

【分類】
数学関数

【書式】
double sin(double x);

【パラメータの型と説明】

パラメータ説明
double x

【機能説明】
x(ラジアン単位の角度)の正弦(サイン)を-1〜1の範囲で返します。

Study Cを使用している場合は、下記のようにコマンドラインから実行(exprコマンドを使用)して動作を確認することができます。

C:\StudyC\MyProg>expr sin(3.1415926535/2)
<double>1

C:\StudyC\MyProg>expr sin(3.1415926535)
<double>8.97932e-11

C:\StudyC\MyProg>expr sin(3.14159265358979323846)
<double>1.22515e-16

1番目は、π/2(90度)で1.0になります。
2番目は、π(180度)で0.0になるはずです。しかし、実際にはちょうど0.0にはなりません。
3番目は、πの値の精度を上げていっても0に近づいていきますが、ちょうど0にはなりません。

通常のコンパイラを使用する場合の使用例は下記になります(もちろんStudy CでもOKです)。

#include <stdio.h>

main()
{
        printf("%g\n", sin(3.1415926535/2));
        printf("%g\n", sin(3.1415926535));
        printf("%g\n", sin(3.14159265358979323846));
}

実行結果は以下になります。

1
8.97932e-11
1.22515e-16

C言語に限らず浮動小数点型のある言語では誤差がつきものです。 とくに今回の例ではパラメータであるπが無理数なので特に誤差が目立ちます。

角度に対するsin()を計算したい場合はさらに誤差が大きくなります。 Study Cのタートルグラフィックス機能も計算にsin()関数などを使用しています。 開発当初、正方形を描画してみると(例えば100進む90度右に回転を4回繰り返す)もとの位置に戻らないといった現象が起きました。 これも今回と同じ誤差による影響です。 対策としては、下記のプログラムのように結果が 無理数でないパラメータの結果をラップしている関数が返すようにしました。

#define M_PI    3.14159265358979323846

double my_sin(double angle);

main()
{
        printf("%g\n", my_sin(45.0));
        printf("%g\n", my_sin(90.0));
        printf("%g\n", my_sin(270.0));
}

double my_sin(double angle)
{
        double  md;

        md = fmod(angle, 360.0);
        if(md == 0.0 || md == 360.0 || md == -360.0 ||
           md == 180.0 || md == -180.0)
                return(0.0);
        if(md == 90.0 || md == -270.0)
                return(1.0);
        if(md == -90.0 || md == 270.0)
                return(-1.0);
        if(md == 30.0 || md == 150.0 || md == -210.0 || md == -330.0)
                return(0.5);
        if(md == -30.0 || md == -150.0 || md == 210.0 || md == 330.0)
                return(-0.5);
        return(sin(angle * M_PI / 180.0));
}

実行結果は以下になります。

0.707107
1
-1

次のプログラムは、Study Cのサンプルプログラムのsin.cです。 プログラムを実行するとsin()関数のグラフを描画します。

#include <graph.h>

main()
{
        int     t;
        int     x, y, lx, ly;

        gl_openwin(-1, -1, 640, 400, 1);
        gl_line(0, 200, 639, 200, 1, 0, RGB(0, 255, 0));
        gl_line(320, 0, 320, 400, 1, 0, RGB(0, 255, 0));

        lx = ly = -1000;
        for(t = -320; t < 320; t++){
                x = t*5 + 320;
                y = -sin(t/10.0) * 150 + 200;
                if(lx != -1000 && ly != -1000){
                        gl_line(lx, ly, x, y, 1, 0, RGB(255, 0, 255));
                }
                lx = x;
                ly = y;
        }
}

このサンプルプログラムを実行すると次のようなグラフが表示されます。
sin関数のグラフ

【参照関数】
asin
acos
atan
atan2
cos
tan
sinh
cosh
tanh