私が気にする100の事象

気にしなければ始まらない。

C言語/tan関数

概要

C言語タンジェント値を計算する関数です。 <math.h>#includeすることによって使うことができます。

定義

定義は次の通りになります。

double tan(double)
機能 内容
第1引数 double 任意のラジアンx
返り値 double tan(x)

仕様

ISO/IEC 9899:1999 における仕様を示します。

7.12.4.7 The tan functions
Synopsis
1 #include <math.h> double tan(double x);
float tanf(float x);
long double tanl(long double x);
Description
2 The tan functions return the tangent of x (measured in radians). Returns
3 The tan functions return tan x.

また、JIS X 3010:2003 における仕様を示します。

7.12.4.7 tan 関数群
形式 #include <math.h>
double tan(double x);
float tanf(float x);
long double tanl(long double x);
機能 tan 関数群は,x(ラジアン値)の正接を計算する。
返却値 tan 関数群は,正接値を返す。

使用例

#include <stdio.h>
#include <math.h>

#define PI 3.14159265358979323846

int main() {
    printf("%lf\n", tan(0.0));
    printf("%lf\n", tan(PI / 6.0));
    printf("%lf\n", tan(PI / 4.0));
    printf("%lf\n", tan(PI / 3.0));
    printf("%lf\n", tan(PI / 2.0));
    printf("%lf\n", tan(PI));
    return 0;
}

結果は以下のようになります。
コンパイラEmbarcadero C++ 7.20

$ ./a.exe
0.000000
0.577350
1.000000
1.732051
16331778728383844.000000
-0.000000

実装例

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

double sin(double x) {
    double sum, k;
    int i;
    sum = k = x -= (int)(x / (2 * M_PI)) * 2 * M_PI;
    for (i = 2;; i += 2) {
        k *= -(x * x) / (i * (i + 1));
        if (sum == sum + k) return sum;
        else sum += k;
    }
}

double cos(double x) {
    double sum = 1, k = 1;
    int i;
    x -= (int)(x / (2 * M_PI)) * 2 * M_PI;
    for (i = 1;; i += 2) {
        k *= -(x * x) / (i * (i + 1));
        if (sum == sum + k) return sum;
        else sum += k;
    }
}

double tan(double x) {
    return sin(x) / cos(x);
}

sin関数とcos関数を用いて実装することができるはずです。多分。
以下の図は0.000244140625ごとにxの値を変えたときのsin関数とcos関数のfor文の中身の実行回数です。
なお、for文の繰り返し回数は47回以内に収まるようです。

f:id:skytomo:20180519124708p:plain
tan関数における収束回数
マクローリン展開は以下の記事を参考にするといいです。

最終更新日: 2018-05-19