C++
 Computer >> コンピューター >  >> プログラミング >> C++

sin(x)とcos(x)の値を計算するC++プログラムの解説

sin(x)とcos(x)の値を計算するC++プログラム

本記事では、角度を入力として受け取り、その角度に対応するsin(x)(正弦)とcos(x)(余弦)の値を計算して結果を表示するC++プログラムを解説します。ライブラリ関数に頼らず、テイラー展開(マクローリン展開)を用いて数値を近似する手法を紹介します。

sin(x)とは

sin(x)は三角関数の一つで、角度xに対する正弦の値を求めるために使用されます。直角三角形では、斜辺に対する対辺の比として定義されます。

$$\sin (x) = \displaystyle\sum\limits_{k=0}^\infty \frac{(-1)^{k}}{(2k+1)!}x^{2k+1}$$

この無限級数は「x − x³/3! + x⁵/5! − x⁷/7! + …」という形で展開され、項を追加するほど精度の高い近似値が得られます。

cos(x)とは

cos(x)も三角関数の一つで、角度xに対する余弦の値を求めるために使用されます。直角三角形では、斜辺に対する隣辺の比として定義されます。

$$\cos (x) = \displaystyle\sum\limits_{k=0}^\infty \frac{(-1)^{k}}{(2k)!}x^{2k}$$

こちらは「1 − x²/2! + x⁴/4! − x⁶/6! + …」という形で展開されます。

プログラムのアプローチ

  • sin(x)とcos(x)を求める角度xの値を入力する
  • 上記のテイラー展開の公式を適用し、誤差が許容範囲(0.0001)以下になるまで項を加算する
  • 計算結果を表示する

なお、三角関数の級数展開はラジアン単位で行うため、入力された角度(度)はあらかじめラジアンに変換しておく必要があります。

アルゴリズム

START
Step 1-> sinの値を計算する関数を宣言
    void cal_sin(float n)
    float acc = 0.0001, denominator, sinx, sinval を宣言・設定
    n = n * (3.142 / 180.0) を設定(ラジアンに変換)
    float temp = n を宣言
    sinx = n を設定
    sinval = sin(n) を設定
    int i = 1 を宣言・設定
    DO
        denominator = 2 * i * (2 * i + 1) を設定
        temp = -temp * n * n / denominator を設定
        sinx = sinx + temp を設定
        i = i + 1 を設定
    WHILE(acc <= fabs(sinval - sinx))
        sinx を表示
Step 2-> cosの値を計算する関数を宣言
    void cal_cos(float n)
    float acc = 0.0001, temp, denominator, cosx, cosval を宣言・設定
    n = n * (3.142 / 180.0) を設定(ラジアンに変換)
    temp = 1 を設定
    cosx = temp を設定
    cosval = cos(n) を設定
    int i = 1 を設定
    DO
        denominator = 2 * i * (2 * i - 1) を設定
        temp = -temp * n * n / denominator を設定
        cosx = cosx + temp を設定
        i = i + 1 を設定
    WHILE(acc <= fabs(cosval - cosx))
        cosx を表示
Step 3-> main() 内で
    float n = 30 を宣言
    cal_sin(n) を呼び出し
    n = 60 を設定
    cal_cos(n) を呼び出し
STOP

サンプルコード

#include <iostream>
#include <math.h>
using namespace std;
// sinの値を計算する関数
void cal_sin(float n) {
    float acc = 0.0001, denominator, sinx, sinval;
    n = n * (3.142 / 180.0);  // ラジアンに変換
    float temp = n;
    sinx = n;
    sinval = sin(n);  // 基準値(ライブラリ関数)
    int i = 1;
    do {
        denominator = 2 * i * (2 * i + 1);
        temp = -temp * n * n / denominator;
        sinx = sinx + temp;
        i = i + 1;
    } while (acc <= fabs(sinval - sinx));
    cout << sinx;
}
// cosの値を計算する関数
void cal_cos(float n) {
    float acc = 0.0001, temp, denominator, cosx, cosval;
    n = n * (3.142 / 180.0);  // ラジアンに変換
    temp = 1;
    cosx = temp;
    cosval = cos(n);  // 基準値(ライブラリ関数)
    int i = 1;
    do {
        denominator = 2 * i * (2 * i - 1);
        temp = -temp * n * n / denominator;
        cosx = cosx + temp;
        i = i + 1;
    } while (acc <= fabs(cosval - cosx));
    cout << cosx;
}
int main() {
    float n = 30;
    cout << "value of Sin is : ";
    cal_sin(n);
    cout << "\n";
    n = 60;
    cout << "value of Cos is : ";
    cal_cos(n);
    return 0;
}

出力結果

value of Sin is : 0.500061
value of Cos is : 0.499847

解説

このプログラムでは、変数accが許容誤差(0.0001)を表しており、級数の近似値sinx(またはcosx)とライブラリ関数の値sinval(またはcosval)との差がこの誤差以下になるまで、do-whileループで項の加算を繰り返します。

30度のsinは理論上0.5、60度のcosも0.5ですが、出力結果にはわずかな誤差(0.500061、0.499847)が含まれています。これは、円周率を3.142と近似していること、および許容誤差の設定によるものです。より高い精度が必要な場合は、accの値を小さくしたり、円周率により正確な値(M_PIなど)を使用したりすることで改善できます。


  1. グラフのエッジカバー(辺被覆)を求めるC++プログラムの解説

    グラフの頂点数 n が与えられたとき、そのグラフのエッジカバー(辺被覆)を計算するのが本記事のテーマです。エッジカバーとは、グラフのすべての頂点を覆うために必要な最小の辺の数を見つける問題を指します。 エッジカバーとは 例として、頂点数 n = 5 のグラフを考えてみましょう。グラフは次のようになります。 このグラフのエッジカバーは 3 です。つまり、3本の辺を選ぶことで、5つの頂点すべてを覆うことができます。 次に、頂点数 n = 8 の場合を見てみましょう。 この場合のエッジカバーは 4 になります。 入出力例 入力: n = 5 出力: 3 入力: n = 8 出力: 4 計算の

  2. C++で正三角形の面積と周囲の長さを計算するプログラム

    正三角形とは? その名の通り、正三角形とは3つの辺の長さがすべて等しく、内角もすべて60°で等しい三角形のことです。正多角形の一種であるため、「正多角形としての三角形(regular polygon)」とも呼ばれます。 正三角形には以下のような性質があります。 3つの辺の長さがすべて等しい すべての内角が同じ60°である 下記は正三角形の図です。 問題の概要 正三角形の1辺の長さが与えられたとき、その面積と周囲の長さを求めることが課題です。ここでいう面積とは図形が占める領域の広さを指し、周囲の長さ(外周)とは三角形の境界線の全長を指します。 正三角形の面積と周囲の長さは、それぞれ次の公