math.h
math.h
ヘッダー ファイルは多くの数学関数を提供します。
多くの数学関数の戻り値は double 型ですが、float 型と long double 型の両方が提供されています。たとえば、pow()
関数には、powf()
バージョンと powl()
バージョンもあります。
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);
簡潔にするために、関数の f
サフィックス (float 型) および l
サフィックス (long double) バージョンは以下では省略されています。
型とマクロ
math.h は 2 つの新しい型エイリアスを定義します。
- float_t: (現在) float 演算を実行するための最も効率的なタイプ。少なくとも float と同じ幅です。
- double_t: (現在) double 操作を実行するための最も効率的なタイプ (少なくとも double と同じ幅)。
それらの特定のタイプは、マクロ FLT_EVAL_METHOD
を通じて理解できます。
| FLT_EVAL_METHOD の値 | float_t に対応する型 | |-----------------|-----------------|--------------- ----| | 0 | 倍精度浮動小数点 | | 1 | ダブル | | 2 | 長い倍精度 | | その他 | 実装により決定 |
math.h ではいくつかのマクロも定義されています。
INFINITY
: 正の無限大を表し、float 型の値を返します。NAN
: Not-A-Number を表し、float 型の値を返します。
エラーの種類
数学関数によって報告されるエラーには次の種類があります。
- 範囲エラー: 演算結果が関数の戻り値の型で表現できません。
- ドメイン エラー: 関数パラメーターは現在の関数に適用できません。
- 極誤差: 関数の限界値が無限大になる原因となるパラメーター。
- オーバーフローエラー: 演算結果が大きすぎるため、オーバーフローが発生します。
- アンダーフローエラー: 演算結果が小さすぎるため、オーバーフローが発生します。
変数 math_errhandling
は、現在のシステムが数学的演算エラーをどのように処理するかを示します。
| math_errhandling の値 | |----------------------|-----| | MATH_ERRNO | システムは errno を使用して数学エラーを示します。 | MATH_ERREXCEPT | システムは例外を使用して数学エラーを示します。 | MATH_ERREXCEPT | システムは両方を使用して数学エラーを示します。
数値型
数学関数のパラメータは、通常値、無限値、有限値、および非数値のカテゴリに分類できます。
次の関数は、値の型を決定するために使用されます。
- fpclassify(): 指定された浮動小数点数の分類を返します。
- isfinite(): 引数が無限または NaN でない場合は True。
- isinf(): 引数が無限の場合は true。
- isnan(): 引数が数値でない場合は true。
- isnormal(): 引数が正規数の場合は true。
以下に例を示します。
isfinite(1.23) // 1
isinf(1/tan(0)) // 1
isnan(sqrt(-1)) // 1
isnormal(1e-310)) // 0
サインビット()
signbit()
はパラメータに符号があるかどうかを決定します。引数が負の場合は 1 を返し、それ以外の場合は 0 を返します。
サインビット(3490.0) // 0
サインビット(-37.0) // 1
三角関数
以下は、ラジアン単位のパラメータを持つ三角関数です。
- acos(): 逆余弦。
- asin(): 逆正弦。
- atan(): 逆正接
- atan2(): 逆正接。
- cos(): コサイン。
- sin(): 正弦。
- Tan(): 正接。
上記のすべての関数には、float バージョン (f 接尾辞が追加された関数名) と、long double バージョン (l 接尾辞が追加された関数名) があることを忘れないでください。
以下に例を示します。
cos(PI/4) // 0.707107
双曲線関数
以下は双曲線関数で、パラメータはすべて浮動小数点数です。
- acosh(): 逆双曲線余弦。
- asinh(): 逆双曲線正弦。
- atanh(): 逆双曲線正接。
- cosh(): 双曲線余弦。
- Tanh(): 双曲線正接。
- sinh(): 双曲線正弦。
指数関数と対数関数
以下は戻り値がdouble型となる指数関数と対数関数です。
- exp(): オイラー数 e のべき乗、つまり ex を計算します。
- exp2(): 2 の累乗、つまり 2x を計算します。
- expm1(): ex - 1 を計算します。
- log():
exp()
の逆演算である自然対数を計算します。 - log2(): 底 2 の対数を計算します。
- log10(): 10 を底とする対数を計算します。
- logp1(): 数値に 1 を加えた自然対数、つまり
ln(x + 1)
を計算します。 - logb(): マクロ
FLT_RADIX
(通常は 2) を底として対数を計算しますが、整数部分のみを返します。
以下にいくつかの例を示します。
exp(3.0) // 20.085500
log(20.0855) // 3.000000
log10(10000) // 3.000000
結果の値が C で表現できる最大値を超える場合、関数は HUGE_VAL
を返します。これは、math.h
で定義されている double 型の値です。
結果の値が小さすぎて double 値として表現できない場合、関数は 0 を返します。上記の状況はどちらもエラーです。
frexp()
frexp()
はパラメータを浮動小数点数と指数部 (2 が底) に分解します。たとえば、1234.56 は 0.6028125 * 211 と書くことができ、この関数は 0.6028125 を分解できます。そして11。
double frexp(double 値, int* exp);
これは 2 つのパラメータを受け入れます。最初のパラメータは分解に使用される浮動小数点数で、2 番目のパラメータは整数変数ポインタです。
小数部を返し、指数部を変数 exp
に代入します。パラメータが「0」の場合、返される小数部と指数部は両方とも「0」です。
以下に例を示します。
ダブルフラク。
int exp;
// expt の値は 11 です
frac = frexp(1234.56, &expt);
// 出力 1234.56 = 0.6028125 x 2^11
printf("1234.56 = %.7f x 2^%d\n", frac, expt);
##ilogb()
ilogb()
は浮動小数点数の指数部分を返します。指数の底はマクロ FLT_RADIX
(通常は 2
) です。
int ilogb(ダブル x);
そのパラメータは x
で、戻り値は logr|x| です。ここで、 r
はマクロ FLT_RADIX
です。
以下に使用例を示します。
ilogb(257) // 8
ilogb(256) // 8
ilogb(255) // 7
ldexp()
ldexp()
は数値を 2 の累乗で乗算します。これは、小数部と指数部を結合して f * 2^n
の形式の浮動小数点数にする frexp()
の逆演算とみなすことができます。
double ldexp(double x, int exp);
2 つのパラメータを受け取り、最初のパラメータは乗数 x
、2 番目のパラメータは 2 exp
の指数部分で、「x * 2exp」を返します。
ldexp(1, 10) // 1024.000000
ldexp(3, 2) // 12.000000
ldexp(0.75, 4) // 12.000000
ldexp(0.5, -1) // 0.250000
modf()
modf()
関数は、数値の整数部分と小数部分を抽出します。
double modf(double 値, double* iptr);
2 つのパラメータを受け取ります。最初のパラメータ value
は分解される値を表し、2 番目のパラメータは浮動小数点変数 iptr
です。戻り値は value
の小数部分であり、整数部分は変数 double
に代入されます。
以下に例を示します。
// int_part の値は 3.0 です
modf(3.14159, &int_part); // 0.14159 を返します。
##scalbn()
scalbn()
は、「x * rn」を計算するために使用されます。ここで、r
はマクロ FLT_RADIX
です。
double scalbn(double x, int n);
2 つのパラメータを受け取ります。最初のパラメータ x
は乗数部分、2 番目のパラメータ n
は指数部分で、戻り値は "x * rn" です。
以下にいくつかの例を示します。
scalbn(2, 8) // 512.000000
この関数には複数のバージョンがあります。
- scalbn(): インデックス n は int 型です。
- scalbnf(): scalbn() の float バージョン。
- scalbnl(): scalbn() の long double バージョン。
- scalbln(): インデックス n は、long int 型です。
- scalblnf(): scalbln() の float バージョン。
- scalblnl(): scalbln() の long double バージョン。
ラウンド()
round()
関数は従来の方法で丸めます。たとえば、1.5
は 2
に丸められ、-1.5
は -2
に丸められます。
ダブルラウンド(ダブルx);
浮動小数点数を返します。
以下にいくつかの例を示します。
Round(3.14) // 3.000000
Round(3.5) // 4.000000
Round(-1.5) // -2.000000
Round(-1.14) // -1.000000
他のバージョンもあります。
・ lround():戻り値はlong int型です。 ・ llround():戻り値はlong long int型になります。
切り捨て()
trunc()
は、浮動小数点数の小数部分を切り捨て、残りの整数部分を浮動小数点数として返すために使用されます。
ダブル trunc(ダブル x);
以下にいくつかの例を示します。
trunc(3.14) // 3.000000
trunc(3.8) // 3.000000
trunc(-1.5) // -1.000000
trunc(-1.14) // -1.000000
セル()
ceil()
は引数以上の最小の整数 (double 型) を「切り上げ」て返します。
ダブル天井(ダブルx);
以下にいくつかの例を示します。
ceil(7.1) // 8.0
ceil(7.9) // 8.0
ceil(-7.1) // -7.0
ceil(-7.9) // -7.0
床()
floor()
は、その引数を超えない最大の整数を「切り捨て」て返します。
ダブルフロア(ダブルx);
以下にいくつかの例を示します。
床(7.1) // 7.0
床(7.9) // 7.0
床(-7.1) // -8.0
床(-7.9) // -8.0
以下の関数で「丸め」を実現できます。
double Round_nearest(double x) {
戻り値 x < 0.0 ? ceil(x - 0.5) : フロア(x + 0.5);
}
fmod()
fmod()
は、最初の引数を 2 番目の引数で割った余りを返します。これは、剰余演算子 %
の浮動小数点バージョンです。これは、%
が整数演算にのみ使用できるためです。
double fmod(double x, double y);
バックグラウンドで実行される計算は x - trunc(x / y) * y
であり、戻り値の符号は x
の符号と同じです。
fmod(5.5, 2.2) // 1.100000
fmod(-9.2, 5.1) // -4.100000
fmod(9.2, 5.1) // 4.100000
浮動小数点比較関数
次の関数は 2 つの浮動小数点数を比較するために使用され、戻り値の型は整数です。
- isgreater():
x > y
の結果を返します。 - isgreaterequal():
x >= y
の結果を返します。 - isless():
x < y
の結果を返します。 - islessequal():
x <= y
の結果を返します。 - islessgreater():
(x < y) || (x > y)
の結果を返します。
以下にいくつかの例を示します。
isgreater(10.0, 3.0) // 1
isgreaterequal(10.0, 10.0) // 1
isless(10.0, 3.0) // 0
islessequal(10.0, 3.0) // 0
islessgreater(10.0, 3.0) // 1
islessgreater(10.0, 30.0) // 1
islessgreater(10.0, 10.0) // 0
は順序付けされていません()
isunowned()
は 2 つのパラメータの中に NAN があるかどうかを返します。
int isunowned(any_floating_type x, any_floating_type y);
以下にいくつかの例を示します。
isunowned(1.0, 2.0) // 0
isunowned(1.0, sqrt(-1)) // 1
isunowned(NAN, 30.0) // 1
isunowned(NAN, NAN) // 1
その他の機能
以下は math.h に含まれる他の関数です。
- pow(): パラメータ
x
のy
べき乗を計算します。 - sqrt(): 数値の平方根を計算します。
- cbrt(): 立方根を計算します。
- fabs(): 絶対値を計算します。
- hypert(): 直角三角形の 2 つの直角辺に基づいて斜辺を計算します。
- fmax(): 2 つのパラメータの最大値を返します。
- fmin(): 2 つのパラメータ間の最小値を返します。
- Remainder():
fmod()
と同様に IEC 60559 標準の剰余を返しますが、剰余の範囲は0
からy
ではなく-y/2
からy/2
です。 - remquo(): 剰余と商を同時に返します。剰余の計算方法はremainder()と同じです。
- copysign(): 最初の引数と等しいサイズと 2 番目の引数と等しい符号を持つ値を返します。
- nan(): NANを返します。
- nextafter(): 現在のシステムが表現できる次の (または前、特定の方向は 2 番目のパラメーター
y
によって異なります) 浮動小数点値を取得します。 - nextoward(): 2 番目のパラメータが long double 型であることを除いて、
nextafter()
と同じです。 - fdim(): 最初のパラメータから 2 番目のパラメータを引いた値が '0' より大きい場合はその差を返し、それ以外の場合は '0' を返します。
- fma(): 高速な計算方法で
x * y + z
の結果を返します。 -nearint(): 現在の丸め方向で最も近い整数に丸めます。現在の丸め方向は、「fesetround()」関数を使用して設定できます。 - rint():
nearbyint()
と同様に、現在の丸め方向で最も近い整数に丸めます。違いは、浮動小数点数に対してINEXACT
例外をトリガーすることです。 - lrint():
rint()
と同様に、現在の丸め方向で最も近い整数に丸めます。違いは、戻り値が浮動小数点数ではなく整数であることです。 - erf(): 値の誤差関数を計算します。
- erfc(): 値の相補誤差関数を計算します。
- tgamma(): ガンマ関数を計算します。
- lgamma(): ガンマ関数の絶対値の自然対数を計算します。
以下にいくつかの例を示します。
pow(3, 4) // 81.000000
sqrt(3.0) // 1.73205
cbrt(1729.03) // 12.002384
fabs(-3490.0) // 3490.000000
Hypot(3, 4) // 5.000000
fmax(3.0, 10.0) // 10.000000
fmin(10.0, 3.0) // 3.000000
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0