3.5 数学関数ライブラリィの利用

通常数学に現われる初等関数や、平方根 $ \sqrt{\quad}$, $ n$ 乗根 $ \sqrt[n]{\quad}$, 絶対値 $ \vert\quad\vert$ などは、 C 言語では数学関数ライブラリィに用意されている。

prog05.c

/* prog05.c --- 数学(関数)ライブラリィにある関数の呼び出し */

#include <stdio.h>
#include <math.h>    /* この行に注目 */

int main(void)
{
  double x;

  printf("一つの実数を入力してください: ");
  scanf("%lf", &x);

  /* ルート (非負の平方根) */
  printf("sqrt(%g)  =%g\n", x, sqrt(x));
  /* 三角関数 sin */
  printf("sin(%g)   =%g\n", x, sin(x));
  /* e を底とする指数関数 */
  printf("exp(%g)   =%g\n", x, exp(x));
  /* 自然対数 */
  printf("log(%g)   =%g\n", x, log(x));
  /* 常用対数 (10 を底とする対数) */
  printf("log10(%g) =%g\n", x, log10(x));
  /* 双曲線関数 hyperbolic sin) */
  printf("sinh(%g) =%g\n", x, sinh(x));
  /* 巾乗 (power) --- ここでは 3 乗根 */
  printf("pow(%g,%g)=%g\n", x, 1.0/3.0, pow(x, 1.0/3.0));
  /* 逆三角関数 Arctan */
  printf("atan(%g)  =%g\n", x, atan(x));
  /* 絶対値 */
  printf("fabs(%g)  =%g\n", x, fabs(x));
  /* 整数部分 (-∞に向かっての切り捨て = いわゆる Gauss の括弧) */
  printf("floor(%g) =%g\n", x, floor(x));
  /* ∞に向かっての切り上げ */
  printf("ceil(%g) =%g\n", x, ceil(x));
  /* 最も近い整数への丸め (≒四捨五入) */
  printf("rint(%g) =%g\n", x, rint(x));

  return 0;
}

コンパイルと実行
% cc -o prog05 prog05.c -lm (-lm が必要。l はエル L の小文字。)
% ./prog05  
(結果省略)  

整数/整数 に注意
上のプログラムで $ \dfrac{1}{3}$ を計算するのに \fbox{\texttt{1.0/3.0}} と しているのに注意。 \fbox{\texttt{1/3}} は整除で 0 になってしまう。 \fbox{\texttt{(double)1/(double)3}} とすべきかもしれないが、 入力が面倒だし、 読みづらいので \fbox{\texttt{1.0/3.0}} あるいは \fbox{\texttt{1.0/3}} などにすることを奨める。

(細かい注) \fbox{\texttt{1.0}} という表記はコンピューターでなければ、 常識的には有効数字 2 桁の数という意味になる。 だからあまり誉められた書き方でないかもしれない。 \fbox{\texttt{1.}} とする人もいるが…まあ好みの問題でしょうか。

円周率 $ \pi$, 自然対数の底 $ e$ など、どうやって用意する?
簡単な応用として、円周率 $ \pi=3.1415926535\cdots$ や 自然対数の底 (Napier の数) $ e=2.7182818284\cdots$ が 必要な場合に
#include <math.h>
double pi, e;
...
int main()
{
  ...
  /* main() の先頭付近で pi, e を初期化 */
  pi = 4.0 * atan(1.0);
  e = exp(1.0);
のようなコードを書くというのがあります。 int main() の前で宣言し (グローバル変数になります)、 プログラム開始早々に代入文を実行して値を設定するわけです。

余談     いわゆる特殊関数が使いたい場合は、 ライブラリィを探すことになるであろう。 その場合、C よりは C++ の方が見つかりやすいかもしれない。



Subsections

桂田 祐史