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.52 に丸められ、-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(): パラメータ xy べき乗を計算します。
  • 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