本物のC

C の知識:math.h


数学関数や浮動小数点数に関する機能を提供します。

三角関数

ラジアン(弧度法)の角度に対する三角関数の値を計算します。

double cos(double x);
double sin(double x);
double tan(double x);

aが付くものは逆三角関数です。a は arc(弧)の略で、角度(ラジアンは単位円上で弧の長さに対応する)を求めるという意味の様です。

double acos(double x);
double asin(double x);
double atan(double x);
double atan2(double y, double x);

acosは 0 以上 π 以下の値を、asinatanは -π/2 以上 +π/2 以下の値を返す様になっています。

atan2(y, x)は点 (x, y) が正の X 軸から何度回転した位置にあるかを調べるもので、-π 以上 +π 以下の値を取ります。

atan2(y, x)xが正の範囲ではatan(y/x)と同じ値になります。

双曲線関数

double cosh(double x);
double sinh(double x);
double tanh(double x);
double acosh(double x);
double asinh(double x);
double atanh(double x);

指数関数

expは指数関数(exponential)を、logは自然対数(logarithm)を計算します。log10及びlog2はそれぞれ 10 及び 2 が底の対数です。

double exp(double x);
double log(double x);
double log10(double x);
double log2(double x);

powは冪乗(power)を計算します。sqrtは二乗根(square root)を、cbrtは三乗根(cubic root)をそれぞれ計算します。

double pow(double x, double y);
double sqrt(double x);
double cbrt(double x);

hypotは直角三角形の斜辺(hypotenuse)の長さを計算します。

double hypot(double x, double y);

つまりhypot(x, y)は √x2 + y2 を求めます。

特殊関数

erfは誤差関数(error function)を、erfcは相補誤差関数(complementary error function)を計算します。

double erf(double x);
double erfc(double x);

tgammaはガンマ関数を、lgammaはガンマ関数の絶対値の自然対数を計算します。

double tgamma(double x);
double lgamma(double x);

tは true(真の)、lは logarithm(対数)を意味します。tgammaと名付けなければならなかったのは、歴史的にgammaという別の関数が先に様々な処理系で実装されていた事に因っている様です。(参考:「Man page of GAMMA」の歴史)

丸め

ceilは天井関数、floorは床関数です。roundは小数点以下を四捨五入し、truncは切り捨てます(truncate)。

double ceil(double x);
double floor(double x);
double round(double x);
double trunc(double x);

これらの関数の違いは以下の様に示されます。

x -2.1 -1.5 -1.4 1.4 1.5 2.1
ceil(x) -2 -1 -1 2 2 3
floor(x) -3 -2 -2 1 1 2
round(x) -2 -2 -1 1 2 2
trunc(x) -2 -1 -1 1 1 2

またroundだけは、整数型を返す関数も用意されています。

long int lround(double x);
long long int llround(double x);

剰余

剰余(余り)を計算します。

double fmod(double x, double y);
double remainder(double x, double y);

fmodxから絶対値がyの絶対値未満になるまでyを引きます。つまりfmod(x, y)は常にx - trunc(x / y) * yと等しい値になります。modは modulo の略です。

一方remainderも同じ様にyを何度か引きますが、引く回数はx / yに最も近い整数となります。x / yが丁度 0.5 の場合、回数は偶数になる様に選ばれます。(「偶数丸め」「銀行丸め」などと呼ばれます。)

その他

fabsは絶対値(absolute value)を返します。

double fabs(double x);

fdimxyより大きい場合はその差を返し、それ以外では 0 を返します。数学的には truncated subtraction 等と呼ばれるものです。

double fdim(double x, double y);

fmaxfminはそれぞれ二つの引数から最大(maximum)または最小(minimum)を返します。

double fmax(double x, double y);
double fmin(double x, double y);

copysignは絶対値がxで符号がyの数を返します。

double copysign(double x, double y);

double以外の型

上ではdouble型の関数しか示していませんが、math.hの大体の関数はそれ以外にも後ろにfが付くfloat型の関数や、lが付くlong double型の関数も実装しています。cosで言えば次の三種類があります。

double cos(double x);
float cosf(float x);
long double cosl(long double x);