• 検索結果がありません。

自習 数学的関数の利用

ドキュメント内 新潟大学学術リポジトリ (ページ 99-102)

91

4 復習 関数 ( その 1)

自習 数学的関数の利用,標準ライブラリ,

自習 ccコマンドの-lmオプション,

関数定義,return文,関数プロトタイプ,

コンパイル・リンクの処理の流れ,

自習 名前(識別子)の有効範囲,外部変数,

再帰,

付録 各種標準ライブラリ関数の使用案内

92 4. 復習 関数 (その1)

10 double x_radian, sin_x, cos_x, tan_x;

11 printf("x(degree) sin(x) cos(x) tan(x)\n"

12 "---\n");

13 for (x=0; x<=90; x+=5) {

14 x_radian = (double)x * PI / 180.0;

15 sin_x = sin(x_radian);

16 cos_x = cos(x_radian);

17 tan_x = sin_x / cos_x;

18 printf("%6d %10.8f %10.8f %15.8g\n", 19 x, sin_x, cos_x, tan_x);

20 }

21 return 0;

22 }

[motoki@x205a]$ gcc function-sin-cos-tan.c -lm [motoki@x205a]$ ./a.out

x(degree) sin(x) cos(x) tan(x)

---0 0.00000000 1.00000000 0

5 0.08715574 0.99619470 0.087488664 10 0.17364818 0.98480775 0.17632698 15 0.25881905 0.96592583 0.26794919 20 0.34202014 0.93969262 0.36397023 25 0.42261826 0.90630779 0.46630766 30 0.50000000 0.86602540 0.57735027 35 0.57357644 0.81915204 0.70020754 40 0.64278761 0.76604444 0.83909963

45 0.70710678 0.70710678 1

50 0.76604444 0.64278761 1.1917536 55 0.81915204 0.57357644 1.428148 60 0.86602540 0.50000000 1.7320508 65 0.90630779 0.42261826 2.1445069 70 0.93969262 0.34202014 2.7474774 75 0.96592583 0.25881905 3.7320508 80 0.98480775 0.17364818 5.6712818 85 0.99619470 0.08715574 11.430052 90 1.00000000 0.00000000 1.6331239e+16 [motoki@x205a]$

ここで、

• プログラム5行目 は、/usr/include/math.h というファイルの中身をこの場所に挿 入してコンパイル作業を行うことを指示する。プログラムの15∼16行目 で sin, cos という数学的関数を使っているので、これらの関数の引数の型,関数値の型をコンパ

4.1. 自習 数学的関数の利用 93

イラに知らせるために、この # で始まる行(すなわちプリプロセッサ指令)が必要と なる。

• プログラム14行目 は角度の単位(度)をラジアンに変換している。

• プログラム18行目 の出力書式中の%6d は、出力フィールドの大きさを6桁として右 詰めに出力することを表す。%10.8f は出力フィールドの大きさを10桁,小数点以下 の桁数を8桁として出力することを表す。[但し、いずれの場合も、データが大きい場 合は必要なだけの桁数で出力される。] また、%15.8g は出力フィールドの大きさを 15桁,有効桁数を8桁として、出来るだけ指数部なしで出力することを表す。

• gccコマンド の最後に付けた-lmオプションは、関数の翻訳コードを繋げて実行コー ドを作る際、別途用意されている数学的関数の翻訳コードも取り込むことを指示して

いる。 [数学的関数以外の標準ライブラリ関数、例えばprintf や scanf などについ

ては、オプション指定しなくても自動的に関数の翻訳コードが取り込まれるが、数学 的関数については明示しないといけない。 この講義ノートの2.5節, 4.4節を参照。]

'

&

$

% 補足:

-lmオプションを付けないと次の様にコンパイルエラーになる。

[motoki@x205a]$ gcc function-sin-cos-tan.c /tmp/ccTg4Sgp.o: In function ‘main’:

/tmp/ccTg4Sgp.o(.text+0x60): undefined reference to ‘sin’

/tmp/ccTg4Sgp.o(.text+0x74): undefined reference to ‘cos’

collect2: ld returned 1 exit status [motoki@x205a]$

注目点:

• 数学的関数を使う場合、#include <math.h> という行は数学的関数を呼 び出す部分を間違いなく翻訳するために必要となり、ccコマンドの-lmオ プションは数学的関数の翻訳コードも取り込んで完全な実行コードを作る ために必要となる。

C言語においては、次のような数学的関数が標準ライブラリに用意されている。

関数名 ( 引数

機能 の並び ) 引数の型 関数値の型 説明

切捨て floor(a) double double ⌊a⌋

切上げ ceil(a) double double ⌈a⌉

剰余 fmod(a,b) double double a≥0の時はa− |b|×⌊a/|b|⌋

a <0の時はa− |b|×⌈a/|b|⌉

絶対値 fabs(a) double double |a|

平方根 sqrt(a) double double √a

べき乗 pow(a,b) double double ab

ldexp(a,n) doubleint double a×2n

指数 exp(a) double double ea

自然対数 log(a) double double logea

常用対数 log10(a) double double log10a

正弦 sin(a) double double sina,但し aはラジアン

余弦 cos(a) double double cosa,但し aはラジアン

正接 tan(a) double double tana,但し aはラジアン

94 4. 復習 関数 (その1)

関数名 ( 引数

機能 の並び ) 引数の型 関数値の型 説明 逆正弦 asin(a) double double sin−1a∈[−π2,π2] 逆余弦 acos(a) double double cos−1a∈[0, π]

逆正接 atan(a) double double tan−1a∈[−π2,π2] atan2(a,b) double double tan−1 ab ∈[−π2,π2] 双曲線正弦 sinh(a) double double sinha

双曲線余弦 cosh(a) double double cosha 双曲線正接 tanh(a) double double tanha

整数部と小 double aの小数部(符号はaと同じ) 数部に分離 modf(a,ptr) (double *) double を返し、aの整数部を ptr

の指す領域に格納 仮数部と指 double 関数呼び出し直後は 数部に分離 frexp(a,ptr) (int *) double a(関数値)

×2(ptrの指すint型の値)

補足: C言語では、数学的関数には分類されていないが次のような関数も標準ライブラ リに用意されている。[詳しくはケリー&ポール付録A.13節,浦&原田付録5などを参照し て下さい。RAND_MAX は/usr/include/stdlib.h の中で定義されたマクロ名、div_t と ldiv_t は /usr/include /stdlib.h の中で定義された「構造体」の名前である。構造体 についてはこの講義ノートの第11節を参照して下さい。]

関数名 ( 引数

機能 の並び) 引数の型 関数値の型 説明

乱数 rand() なし int 区間[0,RAND_MAX)の間の疑似乱数

srand() unsigned int なし 疑似乱数発生器の状態を初期化

絶対値 abs(a) int int |a|

labs(a) long long |a|

商と剰余 div(a,b) int div_t abで割った時の商と剰余の組

ldiv(a,b) long ldiv_t abで割った時の商と剰余の組

ドキュメント内 新潟大学学術リポジトリ (ページ 99-102)