このヘッダの目的
<math.h>は、良く使われる数学の関数を提供する。
定義済み識別子
働き
数学関数は一つの演算のように動作するが、エラー時にerrnoをセットする。
渡した引数が定義域の範囲を超えていた場合、ドメインエラーが起こり、EDOMがセットされる。 これは例えば、指数関数の低に負を指定した時などに発生する。
返り値がdoubleの表現能力を超えていた場合、レンジエラーとなり、ERANGEがセットされるかもしれない。
値が大きすぎた場合、関数は妥当な符号であるHUGE_VALを返し、errnoにERANGEをセットする。
小さすぎた場合は0.を返し、errnoをERANGEにセットするかもしれない。
値が小さすぎた場合に errno
がどうなるかは、処理系に任されている。
これらの関数は、初等数学を学んでいれば意味がわかるはずである。わからなければ関数名で Web 検索をしてみるとよい。
処理系によっては、円周率、自然対数の底などの定数をヘッダファイルでマクロとして定義している場合がある( M_PI
や M_E
等という名前で)。
しかし、これは規格では定義されていないので、使えば互換性がなくなる。
互換性を保ちたいなら、ヘッダファイルのマクロ定義をソースの先頭にコピーし、 #ifndef
で挟めばよい。
例: #ifndef M_PI #define M_PI 3.14159265358979 #endif
角度はすべてラジアン(radian:弧度法の単位)である。 度(degree)からラジアンへの変換とその逆は、以下のようなマクロを定義しておくと簡単である。
#define deg_to_rad(deg) (((deg)/360)*2*M_PI) #define rad_to_deg(rad) (((rad)/2/M_PI)*360)