表を作ろう

  1. この問題を解決するには日本語を噛み砕くのがよい。
    まず、 1度刻みで0度から90度まで は、C的に読み直すと、 角度と0度とし、繰り返すたびに、1度づつ増やして、90度まで ということであるので、
    double deg;
    
    deg = 0;              // 角度と0度とし、
    while (deg <= 90.0) { // 90度まで繰り返すたびに、
        deg += 1.0;       // 1度づつ増やして、
        ...;              // 計算する
    
    }
    
    である.
    ソースは直感的には
        1: #include <stdio.h>
        2: #include <math.h>
        3: 
        4: #define  START   ( 0.0)
        5: #define  END     (90.0)
        6: #define  STEP    ( 1.0)
        7: #define  D2R     (M_PI / 180.0)
        8: 
        9: int
       10: main(void)
       11: {
       12:     double x, d, dx;
       13: 
       14:     printf("#========================================================\n");
       15:     printf("#angle deg    sin(x)     cos(x)     tan(x)    sin(x^2)   \n");
       16:     printf("#------------------------------------------------------- \n");
       17:     dx = D2R * STEP;
       18:     x = START * D2R;
       19:     for (d = START; d < END; d += STEP) {
       20:         printf(" %8.1f %10.4f %10.4f %10.4f %10.4f\n", sin(x), cos(x), tan(x), sin(x * x));
       21:         x += dx;
       22:     }
       23:     printf(" %8.1f %10.4f %10.4f %10.3e %10.4f\n", sin(x), cos(x), tan(x), sin(x * x));
       24:     printf("#------------------------------------------------------- \n");
       25:     return (0);
       26: }
    
    である.4から7行目は大切である. (STEP)度刻みで (START)度から (END)度までと 汎用の形式にすると,#define で置換を定義し19行ではこれを使う. 4行めから7行めを変更するだけで表の範囲などが変わる.
      また,さらに 23行がなぜ必要か?.なぜ 19行めを
       19:     for (d = START; d < END; d += STEP) {
    
    としないのかも考えてみよう.
    おそらく最初次のようにしたはず.しかし,
       18:
       19:     for (d = START; d < END; d += STEP) {
       20:         x = D2R * d;
       21:         printf(" %8.1f %10.4f %10.4f %10.4f %10.4f\n", sin(x), cos(x), tan(x), sin(x * x));
       22:     }
       23:     x = D2R * d;
       24:     printf(" %8.1f %10.4f %10.4f %10.3e %10.4f\n", sin(x), cos(x), tan(x), sin(x * x));
    
    では,ループ中に掛け算があるだけの違いである.できるだけ時間のかかる演算 をループにいれないならば,
         double s, c, t;
    
         for (d = START; d < END; d += STEP) {
             x = D2R * d;
    	 s = sin(x);
             c = sqrt(1.0 - s * s);
             t = s / c;
             printf(" %8.1f %10.4f %10.4f %10.4f %10.4f\n", s, c, t, sin(x*x));
         }
         x = D2R * d;
         s = sin(x);
         c = sqrt(1.0 - s * s);
         t = 1.0e+38;
         printf(" %8.1f %10.4f %10.4f %10.3e %10.4f\n", s, c, t, sin(x*x));
    
    として,三角関数を呼ぶ回数を減らして高速化を行う.つまり,随所に三角関数 の基礎の関係をちゃんと使う必要がある.Cの記述では xの2乗は pow(x,2.0) ではなく, x * x である.

[戻る]
Copyright 2003 Ken Kishimoto