数値計算
円の面積を求める
code:area.c
int main(void)
{
double a, r;
printf("半径? "); scanf("%lf", &r);
a = M_PI * r * r;
printf("円の面積は %g です。\n", a);
return 0;
}
#include <math.h> によって,数学関数や,上で使った M_PI(π)が使えるようになる。
サイン・コサインの数表を作る
code:sincos.c
int main(void)
{
int i;
double theta;
printf("度 sin cos\n");
for (i = 0; i <= 90; i++) {
theta = M_PI * i / 180;
printf("%2d %8.6f %8.6f\n", i, sin(theta), cos(theta));
}
return 0;
}
上のプログラムをコンパイルするには,数学ライブラリをリンクするためのオプション -lm が必要な場合がある。つまり,gcc -lm sincos.c または gcc sincos.c -lm のように打ち込む。
for (i = 0; i <= 90; i++) は i を0から90まで1ずつ増しながら繰り返し実行する
無限大など
$ \tan(\pi/2) は無限大になるはずだが・・・
code:sincos2.c
int main(void)
{
int i;
double theta;
printf("度 sin cos tan\n");
for (i = 0; i <= 90; i++) {
theta = M_PI * i / 180;
printf("%2d %8.6f %8.6f %9.6f\n", i, sin(theta), cos(theta), tan(theta));
}
return 0;
}
数値計算の誤差のため,うまく無限大にならない。
次のようにすればよい:
code:sincos3.c
int main(void)
{
int i;
double theta, t;
printf("度 sin cos tan\n");
for (i = 0; i <= 90; i++) {
theta = M_PI * i / 180;
if (i != 90) {
t = tan(theta);
} else {
t = INFINITY;
}
printf("%2d %8.6f %8.6f %9.6f\n", i, sin(theta), cos(theta), t);
}
return 0;
}
この INFINITY も M_PI 同様 math.h で定義されている(古いC言語の処理系では定義されていないが 1.0/0.0 などと書けば無限大になる)。ほかに 0.0/0.0 に相当する不定な値 NAN(Not-a-Number,NaN,非数)も定義されている。