『新ANCI C言語辞典 (平林 雅英 著)』にマクローリン展開による三角関数の定義例が書いてあったのでそれを参考にJavaで実装してみた。

せっかくなので、絶対値、剰余、ラジアン⇆度の変換などの関数(メソッド)も標準ライブラリを使わずに車輪の再発明。


public class MyMath {
 
  public static void main(String[] args) {
    for (int i = -360; i <= 360; i += 30) {
      double radian = MyMath.toRadians(i);
      System.out.println("----------------------------------------");
      System.out.println("degree: " + i);
      System.out.println("radian: " + radian);
      System.out.println("sin: " + MyMath.sin(radian));
      System.out.println("cos: " + MyMath.cos(radian));
      System.out.println("tan: " + MyMath.tan(radian));
    }
    for (int i = -360; i <= 360; i += 30) {
      double radian = Math.toRadians(i);
      System.out.println("----------------------------------------");
      System.out.println("degree: " + i);
      System.out.println("radian: " + radian);
      System.out.println("sin: " + Math.sin(radian));
      System.out.println("cos: " + Math.cos(radian));
      System.out.println("tan: " + Math.tan(radian));
    }
  }
 
  public static final double PI = 3.14159265358979323846;
 
  /**
   * 角度のラジアンを返す。
   * @param degree 角度の°(度)
   * @return 角度のラジアン
   */
  public static double toRadians(double degree) {
    return degree / 180.0 * PI;
  }
 
  /**
   * 角度の°(度)を返す。
   * @param radian 角度のラジアン
   * @return 角度の°(度)
   */
  public static double toDegrees(double radian) {
    return radian / PI * 180.0;
  }
 
  /**
   * 絶対値を返す。
   * @param x 絶対値を求めたい値
   * @return 絶対値
   */
  public static double abs(double x) {
    return x >= 0 ? x : -x;
  }
 
  /**
   * 剰余を返す。
   * @param n 分子
   * @param d 分母
   * @return 剰余
   */
  public static double remainder(double n, double d) {
    if (n == 0 || d == 0) {
      return 0;
    }
    if (n > 0) {
      return n - (long) abs(n / d) * abs(d);
    } else {
      return n + (long) abs(n / d) * abs(d);
    }
  }
 
  /**
   * 正弦(サイン)を返す。
   * @param q ラジアンで表した角度
   * @return 正弦(サイン)
   */
  public static double sin(double q) {
    double n = 1;
    double y = 1;
    double d = 1;
    double y2;
    q = remainder(q, PI * 2);
    do {
      d *= -q * q / (2 * n * (2 * n + 1));
      y2 = y;
      y += d;
      n++;
    } while (y != y2);
    return q * y;
  }
 
  /**
   * 余弦(コサイン)を返す。
   * @param q ラジアンで表した角度
   * @return 余弦(コサイン)
   */
  public static double cos(double q) {
    double n = 1;
    double y = 1;
    double d = 1;
    double y2;
    q = remainder(q, PI * 2);
    do {
      d *= -q * q / ((2 * n - 1) * 2 * n);
      y2 = y;
      y += d;
      n++;
    } while (y != y2);
    return y;
  }
 
  /**
   * 正接(タンジェント)を返す。
   * @param q ラジアンで表した角度
   * @return 正接(タンジェント)
   */
  public static double tan(double x) {
    return sin(x) / cos(x);
  }
}

プログラムを実行した結果をわかりやすいように左右に並べてみた。

左が自前で実装したMyMathクラスによる出力結果。
右が標準ライブラリのMathクラスによる出力結果。

MyMathMath

----------------------------------------
degree: -360
radian: -6.283185307179586
sin: 0.0
cos: 1.0
tan: 0.0
----------------------------------------
degree: -330
radian: -5.759586531581287
sin: 0.4999999999999986
cos: 0.8660254037844388
tan: 0.5773502691896241
----------------------------------------
degree: -300
radian: -5.235987755982989
sin: 0.8660254037844373
cos: 0.49999999999999833
tan: 1.7320508075688803
----------------------------------------
degree: -270
radian: -4.71238898038469
sin: 0.9999999999999994
cos: 1.70175498726576E-17
tan: 5.8762865834565128E16
----------------------------------------
degree: -240
radian: -4.1887902047863905
sin: 0.8660254037844385
cos: -0.5000000000000003
tan: -1.7320508075688759
----------------------------------------
degree: -210
radian: -3.6651914291880923
sin: 0.4999999999999999
cos: -0.8660254037844389
tan: -0.5773502691896254
----------------------------------------
degree: -180
radian: -3.141592653589793
sin: -4.586552124298661E-17
cos: -1.0
tan: 4.586552124298661E-17
----------------------------------------
degree: -150
radian: -2.6179938779914944
sin: -0.49999999999999983
cos: -0.8660254037844387
tan: 0.5773502691896255
----------------------------------------
degree: -120
radian: -2.0943951023931953
sin: -0.8660254037844387
cos: -0.4999999999999998
tan: 1.732050807568878
----------------------------------------
degree: -90
radian: -1.5707963267948966
sin: -1.0
cos: 4.5907218229751464E-17
tan: -2.1783066771663412E16
----------------------------------------
degree: -60
radian: -1.0471975511965976
sin: -0.8660254037844385
cos: 0.5000000000000001
tan: -1.7320508075688765
----------------------------------------
degree: -30
radian: -0.5235987755982988
sin: -0.4999999999999999
cos: 0.8660254037844386
tan: -0.5773502691896256
----------------------------------------
degree: 0
radian: 0.0
sin: 0.0
cos: 1.0
tan: 0.0
----------------------------------------
degree: 30
radian: 0.5235987755982988
sin: 0.4999999999999999
cos: 0.8660254037844386
tan: 0.5773502691896256
----------------------------------------
degree: 60
radian: 1.0471975511965976
sin: 0.8660254037844385
cos: 0.5000000000000001
tan: 1.7320508075688765
----------------------------------------
degree: 90
radian: 1.5707963267948966
sin: 1.0
cos: 4.5907218229751464E-17
tan: 2.1783066771663412E16
----------------------------------------
degree: 120
radian: 2.0943951023931953
sin: 0.8660254037844387
cos: -0.4999999999999998
tan: -1.732050807568878
----------------------------------------
degree: 150
radian: 2.6179938779914944
sin: 0.49999999999999983
cos: -0.8660254037844387
tan: -0.5773502691896255
----------------------------------------
degree: 180
radian: 3.141592653589793
sin: 4.586552124298661E-17
cos: -1.0
tan: -4.586552124298661E-17
----------------------------------------
degree: 210
radian: 3.6651914291880923
sin: -0.4999999999999999
cos: -0.8660254037844389
tan: 0.5773502691896254
----------------------------------------
degree: 240
radian: 4.1887902047863905
sin: -0.8660254037844385
cos: -0.5000000000000003
tan: 1.7320508075688759
----------------------------------------
degree: 270
radian: 4.71238898038469
sin: -0.9999999999999994
cos: 1.70175498726576E-17
tan: -5.8762865834565128E16
----------------------------------------
degree: 300
radian: 5.235987755982989
sin: -0.8660254037844373
cos: 0.49999999999999833
tan: -1.7320508075688803
----------------------------------------
degree: 330
radian: 5.759586531581287
sin: -0.4999999999999986
cos: 0.8660254037844388
tan: -0.5773502691896241
----------------------------------------
degree: 360
radian: 6.283185307179586
sin: 0.0
cos: 1.0
tan: 0.0
----------------------------------------

----------------------------------------
degree: -360
radian: -6.283185307179586
sin: 2.4492935982947064E-16
cos: 1.0
tan: 2.4492935982947064E-16
----------------------------------------
degree: -330
radian: -5.759586531581287
sin: 0.5000000000000004
cos: 0.8660254037844384
tan: 0.5773502691896264
----------------------------------------
degree: -300
radian: -5.235987755982989
sin: 0.8660254037844386
cos: 0.5000000000000001
tan: 1.732050807568877
----------------------------------------
degree: -270
radian: -4.71238898038469
sin: 1.0
cos: -1.8369701987210297E-16
tan: -5.443746451065123E15
----------------------------------------
degree: -240
radian: -4.1887902047863905
sin: 0.8660254037844385
cos: -0.5000000000000004
tan: -1.7320508075688754
----------------------------------------
degree: -210
radian: -3.6651914291880923
sin: 0.5000000000000001
cos: -0.8660254037844386
tan: -0.577350269189626
----------------------------------------
degree: -180
radian: -3.141592653589793
sin: -1.2246467991473532E-16
cos: -1.0
tan: 1.2246467991473532E-16
----------------------------------------
degree: -150
radian: -2.6179938779914944
sin: -0.49999999999999994
cos: -0.8660254037844387
tan: 0.5773502691896257
----------------------------------------
degree: -120
radian: -2.0943951023931953
sin: -0.8660254037844387
cos: -0.4999999999999998
tan: 1.7320508075688783
----------------------------------------
degree: -90
radian: -1.5707963267948966
sin: -1.0
cos: 6.123233995736766E-17
tan: -1.633123935319537E16
----------------------------------------
degree: -60
radian: -1.0471975511965976
sin: -0.8660254037844386
cos: 0.5000000000000001
tan: -1.7320508075688767
----------------------------------------
degree: -30
radian: -0.5235987755982988
sin: -0.49999999999999994
cos: 0.8660254037844387
tan: -0.5773502691896257
----------------------------------------
degree: 0
radian: 0.0
sin: 0.0
cos: 1.0
tan: 0.0
----------------------------------------
degree: 30
radian: 0.5235987755982988
sin: 0.49999999999999994
cos: 0.8660254037844387
tan: 0.5773502691896257
----------------------------------------
degree: 60
radian: 1.0471975511965976
sin: 0.8660254037844386
cos: 0.5000000000000001
tan: 1.7320508075688767
----------------------------------------
degree: 90
radian: 1.5707963267948966
sin: 1.0
cos: 6.123233995736766E-17
tan: 1.633123935319537E16
----------------------------------------
degree: 120
radian: 2.0943951023931953
sin: 0.8660254037844387
cos: -0.4999999999999998
tan: -1.7320508075688783
----------------------------------------
degree: 150
radian: 2.6179938779914944
sin: 0.49999999999999994
cos: -0.8660254037844387
tan: -0.5773502691896257
----------------------------------------
degree: 180
radian: 3.141592653589793
sin: 1.2246467991473532E-16
cos: -1.0
tan: -1.2246467991473532E-16
----------------------------------------
degree: 210
radian: 3.6651914291880923
sin: -0.5000000000000001
cos: -0.8660254037844386
tan: 0.577350269189626
----------------------------------------
degree: 240
radian: 4.1887902047863905
sin: -0.8660254037844385
cos: -0.5000000000000004
tan: 1.7320508075688754
----------------------------------------
degree: 270
radian: 4.71238898038469
sin: -1.0
cos: -1.8369701987210297E-16
tan: 5.443746451065123E15
----------------------------------------
degree: 300
radian: 5.235987755982989
sin: -0.8660254037844386
cos: 0.5000000000000001
tan: -1.732050807568877
----------------------------------------
degree: 330
radian: 5.759586531581287
sin: -0.5000000000000004
cos: 0.8660254037844384
tan: -0.5773502691896264
----------------------------------------
degree: 360
radian: 6.283185307179586
sin: -2.4492935982947064E-16
cos: 1.0
tan: -2.4492935982947064E-16
----------------------------------------

なかなか興味深い結果に。

参考にした『新ANSI C言語辞典』は、関数によっては定義例として関数の中身がCのコードで書かれているので参考になるし おもしろい(・∀・)

Ref. Amazon.co.jp: 新ANSI C言語辞典: 平林 雅英: 本

tags: java math

Posted by NI-Lab. (@nilab)