【C++Builder】C ランタイムライブラリリファレンス (math.h)

# 数学関数 (Mathematics)

| ヘッダ<br>ファイル | [math.h](https://docwiki.embarcadero.com/RADStudio/ja/Math.h%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9) |
|:---|:---|
| 規格 | ANSI C (C89) / C90 |
| 概要 | 2 つの型及び多数の数学関数を宣言し、幾つかのマクロを定義する。 |

## プラグマ

| 名前 | 機能 | デフォルト |
|:---|:---|:---:|
| FP_CONTRACT [^1]| 浮動小数点演算式の短縮を認めるか？ | 処理系定義 |

:::note
`#pragma STDC FP_CONTRACT ON` は浮動小数点演算において短縮式の利用を認めます。一般的にはプロセッサが持つ融合積和演算 (FMA) 命令を利用すると処理系に伝える事になるようです。短縮式が使われると浮動小数点例外が発生しなかったり、丸め誤差が通常の演算結果と異なる事があります。
:::

**See also:**

 - [IEEE 754 (Wikipedia)](https://ja.wikipedia.org/wiki/IEEE_754)
 - [融合積和演算 (FMA) (Wikipedia)](https://ja.wikipedia.org/wiki/%E7%A9%8D%E5%92%8C%E6%BC%94%E7%AE%97#%E8%9E%8D%E5%90%88%E7%A9%8D%E5%92%8C%E6%BC%94%E7%AE%97)
 - [FMA (Fused Multiply-Add) - SSE 命令 (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0SIMD%E6%8B%A1%E5%BC%B5%E5%91%BD%E4%BB%A4#FMA_(Fused_Multiply-Add))

## 型

| 名前 | 機能 |
|:---|:---|
| double_t  [^1] | double と同等の幅を持つ浮動小数点型 |
| float_t  [^1] | float と同等の幅を持つ浮動小数点型 |

`double_t` と `float_t` は [float.h](https://qiita.com/ht_deko/private/20cbbe0fa6463b5a3b48) で定義されている `FLT_EVAL_METHOD` の値によって同等の型が変化します。

|   | double_t | float_t |
|:---:|:---|:---|
| -1 | 処理系定義 | 処理系定義 |
| 0 | double | float |
| 1 | double | double |
| 2 | long double | long double |

## マクロ

### オーバーフロー

| 名前 | 機能 |
|:---|:---|
| [HUGE_VAL](https://docwiki.embarcadero.com/RADStudio/ja/HUGE_VAL_define) | double 型算術関数がオーバーフローした時に返される値です。 |
| HUGE_VALF [^1] | float 型算術関数がオーバーフローした時に返される値です。 | 
| HUGE_VALL [^1] | long double 型算術関数がオーバーフローした時に返される値です。 |

### 特殊な値

| 名前 | 機能 |
|:---|:---|
| INFINITY [^1] | 正の無限大を表します。 |
| NAN [^1] | 有効な数値として表現できない値 (NaN) を表します。 |

### 浮動小数点数の分類

fpclassify() が返します。

| 名前 | 機能 |
|:---|:---|
| FP_INFINITE [^1] | 正または負の無限大。 |
| FP_NAN [^1] | NaN 値。 |
| FP_NORMAL [^1] | 正規化数。 |
| FP_SUBNORMAL [^1] | 正規形式で表現するには小さすぎる値。 |
| FP_ZERO [^1] | ゼロ。 |

### 融合積和演算 (FMA)

| 名前 | 機能 |
|:---|:---|
| FP_FAST_FMA [^1] | double 型の加算・乗算演算子による演算より fma() 関数での処理の方が速い事を示します。|
| FP_FAST_FMAF [^1] | float 型の加算・乗算演算子による演算より fmaf() 関数での処理の方が速い事を示します。|
| FP_FAST_FMAL [^1] | long double 型の加算・乗算演算子による演算より fmal() 関数での処理の方が速い事を示します。|

### ilogb()

| 名前 | 機能 |
|:---|:---|
| FP_ILOGB0 [^1] | ilogb() の引数がゼロの場合の値です。 |
| FP_ILOGBNAN [^1] | ilogb() の引数が NaN の場合の値です。 |

### エラーハンドリング

| 名前 | 機能 |
|:---|:---|
| MATH_ERRNO [^1] | 算術関数でのエラー発生時に [errno](https://docwiki.embarcadero.com/RADStudio/ja/Errno%EF%BC%88C_%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%EF%BC%89) を使う事を意味します。値は 1。 |
| MATH_ERREXCEPT [^1] | 算術関数でのエラー発生時に、浮動小数点例外を使う事を意味します。値は 2。 |
| math_errhandling [^1] | 算術関数でのエラーハンドリングの方法を示します。MATH_ERRNO と MATH_ERREXCEPT またはそれらの論理和です。 |



## 引数付きマクロ

| 名前 | 機能 |
|:---|:---|
| fpclassify() [^1] | x の浮動小数点型の分類を返します。 |
| isfinite() [^1] | x が有限範囲内なら非ゼロを返します。 |
| isinf() [^1] | x が無限大なら非ゼロを返します。 |
| isnan() [^1] | x が NaN なら非ゼロを返します。 |
| isnormal() [^1] | x が正規化数なら非ゼロを返します。 |
| signbit() [^1] | x が負数なら非ゼロを返します。 |
| isgreater() [^1] | x > y なら 1 を、そうでなければ 0 を返します。 |
| isgreaterequal() [^1] | x >= y なら 1 を、そうでなければ 0 を返します。 | |
| isless() [^1] | x < y なら 1 を、そうでなければ 0 を返します。 |
| islessequal() [^1] | x <= y なら 1 を、そうでなければ 0 を返します。 |
| islessgreater() [^1] | (x < y) \|\| (x > y) なら 1 を、そうでなければ 0 を返します。 |
| isunordered() [^1] | x または y が順序値を持たない数 (NaN) なら 1 を、そうでなければ 0 を返します。 |


## 関数

| double | float | long double | 機能 |
|:---|:---|:---|:---|
| [sin()](https://docwiki.embarcadero.com/RADStudio/ja/Sin%EF%BC%8Csinl)       | sinf()   [^1] | [sinl()](https://docwiki.embarcadero.com/RADStudio/ja/Sin%EF%BC%8Csinl)       [^1] | 正弦を求めます。 |
| [cos()](https://docwiki.embarcadero.com/RADStudio/ja/Cos%EF%BC%8Ccosl)       | cosf()   [^1] | [cosl()](https://docwiki.embarcadero.com/RADStudio/ja/Cos%EF%BC%8Ccosl)       [^1] | 余弦を求めます。 |
| [tan()](https://docwiki.embarcadero.com/RADStudio/ja/Tan%EF%BC%8Ctanl)       | tanf()   [^1] | [tanl()](https://docwiki.embarcadero.com/RADStudio/ja/Tan%EF%BC%8Ctanl)       [^1] | 正接を求めます。 |
| [asin()](https://docwiki.embarcadero.com/RADStudio/ja/Asin,_asinl)           | asinf()  [^1] | [asinl()](https://docwiki.embarcadero.com/RADStudio/ja/Asin,_asinl)           [^1] | 逆正弦を求めます。 |
| [acos()](https://docwiki.embarcadero.com/RADStudio/ja/Acos,_acosl)           | acosf()  [^1] | [acosl()](https://docwiki.embarcadero.com/RADStudio/ja/Acos,_acosl)           [^1] | 逆余弦を求めます。 |
| [atan()](https://docwiki.embarcadero.com/RADStudio/ja/Atan,_atanl)           | atanf()  [^1] | [atanl()](https://docwiki.embarcadero.com/RADStudio/ja/Atan,_atanl)           [^1] | 逆正接を求めます。 |
| [atan2()](https://docwiki.embarcadero.com/RADStudio/ja/Atan2,_atan2l)        | atan2f() [^1] | [atan2l()](https://docwiki.embarcadero.com/RADStudio/ja/Atan2,_atan2l)        [^1] | 逆正接を求めます。 |
| [sinh()](https://docwiki.embarcadero.com/RADStudio/ja/Sinh%EF%BC%8Csinhl)    | sinhf()  [^1] | [sinhl()](https://docwiki.embarcadero.com/RADStudio/ja/Sinh%EF%BC%8Csinhl)    [^1] | 双曲線正弦を求めます。 |
| [cosh()](https://docwiki.embarcadero.com/RADStudio/ja/Cosh%EF%BC%8Ccoshl)    | coshf()  [^1] | [coshl()](https://docwiki.embarcadero.com/RADStudio/ja/Cosh%EF%BC%8Ccoshl)    [^1] | 双曲線余弦を求めます。 |
| [tanh()](https://docwiki.embarcadero.com/RADStudio/ja/Tanh%EF%BC%8Ctanhl)    | tanhf()  [^1] | [tanhl()](https://docwiki.embarcadero.com/RADStudio/ja/Tanh%EF%BC%8Ctanhl)    [^1] | 双曲線正接を求めます。 |
| asinh() [^1] | asinhf() [^1] | asinhl() [^1] | 逆双曲線正弦を求めます。 |
| acosh() [^1] | acoshf() [^1] | acoshl() [^1] | 逆双曲線余弦を求めます。 |
| atanh() [^1] | atanhf() [^1] | atanhl() [^1] | 逆双曲線正接を求めます。 |
| cbrt() [^1]       | cbrtf() [^1]        | cbrtl() [^1]       | 立方根を計算します。 |
| [ceil()](https://docwiki.embarcadero.com/RADStudio/ja/Ceil%EF%BC%8Cceill)    | ceilf()  [^1] | [ceill()](https://docwiki.embarcadero.com/RADStudio/ja/Ceil%EF%BC%8Cceill)    [^1] | 小数点以下を切り上げます。 |
| copysign() [^1]   | copysignf() [^1]    | copysignl() [^1]   | x の絶対値で y の符号を持つ値を生成します。 |
| erf() [^1]        | erff() [^1]         | erfl() [^1]        | 誤差関数を計算します。 |
| erfc() [^1]       | erfcf() [^1]        | erfcl() [^1]       | 余誤差関数を計算します。 |
| [exp()](https://docwiki.embarcadero.com/RADStudio/ja/Exp%EF%BC%8Cexpl)       | expf()   [^1] | [expl()](https://docwiki.embarcadero.com/RADStudio/ja/Exp%EF%BC%8Cexpl)       [^1] | e（自然対数の底）の x 乗を計算します。 |
| exp2() [^1]       | exp2f() [^1]        | exp2l() [^1]       | 2 の x 乗を計算します。 |
| expm1() [^1]      | expm1f() [^1]       | expm1l() [^1]      | 自然対数の底 e の x 乗から 1 を引いた値を計算します。 |
| [fabs()](https://docwiki.embarcadero.com/RADStudio/ja/Fabs%EF%BC%8Cfabsl)    | fabsf()  [^1] | [fabsl()](https://docwiki.embarcadero.com/RADStudio/ja/Fabs%EF%BC%8Cfabsl)    [^1] | 浮動小数点数の絶対値を返します。 |
| fdim() [^1]       | fdimf() [^1]        | fdiml() [^1]       | x と y の正の差を求めます。 |
| [floor()](https://docwiki.embarcadero.com/RADStudio/ja/Floor%EF%BC%8Cfloorl) | floorf() [^1] | [floorl()](https://docwiki.embarcadero.com/RADStudio/ja/Floor%EF%BC%8Cfloorl) [^1] | 小数点以下を切り捨てます。 |
| fma() [^1]        | fmaf() [^1]         | fmal() [^1]        | (x*y)+z を 1 個の 3 項演算としてまとめて計算します (FMA)。 |
| fmax() [^1]       | fmaxf() [^1]        | fmaxl() [^1]       | x と y のうち、大きい方の値を求めます。 |
| fmin() [^1]       | fminf() [^1]        | fminl() [^1]       | x と y のうち、小さい方の値を求めます。 |
| [fmod()](https://docwiki.embarcadero.com/RADStudio/ja/Fmod%EF%BC%8Cfmodl)    | fmodf()  [^1] | [fmodl()](https://docwiki.embarcadero.com/RADStudio/ja/Fmod%EF%BC%8Cfmodl)    [^1] | x を y で割った剰余を計算します。 |
| [frexp()](https://docwiki.embarcadero.com/RADStudio/ja/Frexp%EF%BC%8Cfrexpl) | frexpf() [^1] | [frexpl()](https://docwiki.embarcadero.com/RADStudio/ja/Frexp%EF%BC%8Cfrexpl) [^1] | 数値を仮数部と指数部に分割します。  |
| [hypot()](https://docwiki.embarcadero.com/RADStudio/ja/Hypot%EF%BC%8Chypotl) [^1]      | hypotf() [^1]       | [hypotl()](https://docwiki.embarcadero.com/RADStudio/Athens/ja/Hypot%EF%BC%8Chypotl) [^1]      | 直角三角形の斜辺 (x<sup>2</sup> + y<sup>2</sup> の平方根) を計算します。 |
| ilogb() [^1]      | ilogbf() [^1]       | ilogbl() [^1]      | 符号付き整数の値として x の指数を抽出します。 |
| [ldexp()](https://docwiki.embarcadero.com/RADStudio/ja/Ldexp%EF%BC%8Cldexpl) | ldexpf() [^1] | [ldexpl()](https://docwiki.embarcadero.com/RADStudio/ja/Ldexp%EF%BC%8Cldexpl) [^1] | x * 2^exp を計算します。 |
| lgamma() [^1]     | lgammaf() [^1]      | lgammal() [^1]     | ガンマ関数の絶対値の自然対数を計算します。 |
| llround() [^1]    | llroundf() [^1]     | llroundl() [^1]    | 最も近い整数値に丸めます。戻り値の型は long long int です。 |
| [log()](https://docwiki.embarcadero.com/RADStudio/ja/Log%EF%BC%8Clogl)       | logf()   [^1] | [logl()](https://docwiki.embarcadero.com/RADStudio/ja/Log%EF%BC%8Clogl)       [^1] | x の自然対数を計算します。 |
| [log10()](https://docwiki.embarcadero.com/RADStudio/ja/Log10,_log10l)        | log10f() [^1] | [log10l()](https://docwiki.embarcadero.com/RADStudio/ja/Log10,_log10l)        [^1] | 10 を底とする x の対数を計算します。 |
| log1p() [^1]      | log1pf() [^1]       | log1pl() [^1]      | 1 を加えた値の e を底とする (自然) 対数を計算します。 |
| log2() [^1]       | log2f() [^1]        | log2l() [^1]       | 2 を底とする x の対数を計算します。 |
| logb() [^1]       | logbf() [^1]        | logbl() [^1]       | 浮動小数点形式における符号付き整数の値として x の指数を抽出します。 |
| lrint() [^1]      | lrintf() [^1]       | lrintl() [^1]      | その時点の丸め方向に従って最も近い整数値に丸めます。 |
| lround() [^1]     | lroundf() [^1]      | lroundl() [^1]     | 最も近い整数値に丸めます。戻り値の型は long int です。  |
| [modf()](https://docwiki.embarcadero.com/RADStudio/ja/Modf%EF%BC%8Cmodfl)    | modff()  [^1] | [modfl()](https://docwiki.embarcadero.com/RADStudio/ja/Modf%EF%BC%8Cmodfl)    [^1] | 整数部と小数部に分割します。 |
| nan() [^1]        | nanf() [^1]         | nanl() [^1]        | 文字列を NaN 値に変換します。 |
| nearbyint() [^1]  | nearbyintf() [^1]   | nearbyintl() [^1]  | "不正確結果" 浮動小数点例外を生成することなく、丸め方向に従って浮動小数点形式の整数値に丸めます。 |
| nextafter() [^1]  | nextafterf() [^1]   | nextafterl() [^1]  | x と y を関数の型に変換し、実軸上で x から見て y の方向にある x の次に表現可能な値を求めます。 |
| nexttoward() [^1] | nexttowardf() [^1]  | nexttowardl() [^1] | 2 番目の引数の型が long double に固定され、x が y と等しい場合に y をその関数の型に変換して返す事を除いて nextafter() と同じです。|
| [pow()](https://docwiki.embarcadero.com/RADStudio/ja/Pow%EF%BC%8Cpowl)       | powf()   [^1] | [powl()](https://docwiki.embarcadero.com/RADStudio/ja/Pow%EF%BC%8Cpowl)       [^1] | x の y 乗を計算します。 |
| remainder() [^1]  | remainderf() [^1]   | remainderl() [^1]  | IEEE 60559 が要求する x と y の剰余 (REM) を計算します。  |
| remquo() [^1]     | remquof() [^1]      | remquol() [^1]     | 符号と商の近似値を持つ値を、*quo に格納する事を除いて remainder() と同じです。|
| rint() [^1]       | rintf() [^1]        | rintl() [^1]       | 結果が実引数の値と異なる場合、"不正確結果" 浮動小数点例外を生成することがある事を除いて nearbyint() と同じです。 |
| round() [^1]      | roundf() [^1]       | roundl() [^1]      | 浮動小数点形式の最も近い整数値に丸めます。 |
| scalbln() [^1]    | scalblnf() [^1]     | scalblnl() [^1]    | 効率よく x * `FLT_RADIX` ^ n を計算します。戻り値の型は long int です。 |
| scalbn() [^1]     | scalbnf() [^1]      | scalbnl() [^1]     | 効率よく x * `FLT_RADIX` ^ n を計算します。戻り値の型は int です。 |
| [sqrt()](https://docwiki.embarcadero.com/RADStudio/ja/Sqrt%EF%BC%8Csqrtl)    | sqrtf()  [^1] | [sqrtl()](https://docwiki.embarcadero.com/RADStudio/ja/Sqrt%EF%BC%8Csqrtl)    [^1] | 正の平方根を計算します。 |
| tgamma() [^1]     | tgammaf() [^1]      | tgammal() [^1]     | x のガンマ関数を計算します。 |
| trunc() [^1]      | truncf() [^1]       | truncl() [^1]      | 浮動小数点形式の最も近い整数値に丸めます。 |

:::note info
引数 / 戻り値の型 (`double`, `float`, `long double`) によって関数名が異なります。この煩わしさを回避するために  **型総称数学関数** ([tgmath.h](https://qiita.com/ht_deko/items/28042d097f5054c2e45a)) が用意されています。
:::

**See also:**

 - [ガンマ関数 (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%B3%E3%83%9E%E9%96%A2%E6%95%B0)
 - [誤差関数 (Wikipedia)](https://ja.wikipedia.org/wiki/%E8%AA%A4%E5%B7%AE%E9%96%A2%E6%95%B0)
 - [三角関数 (Wikipedia)](https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0)
 - [対数 (Wikipedia)](https://ja.wikipedia.org/wiki/%E5%AF%BE%E6%95%B0)
 - [自然対数 (Wikipedia)](https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E5%AF%BE%E6%95%B0)
 - [剰余計算 (Wikipedia)](https://ja.wikipedia.org/wiki/%E5%89%B0%E4%BD%99%E6%BC%94%E7%AE%97)
 - [端数計算 (Wikipedia)](https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%95%B0%E5%87%A6%E7%90%86)
 - [融合積和演算 (FMA) (Wikipedia)](https://ja.wikipedia.org/wiki/%E7%A9%8D%E5%92%8C%E6%BC%94%E7%AE%97#%E8%9E%8D%E5%90%88%E7%A9%8D%E5%92%8C%E6%BC%94%E7%AE%97)

## 資料

 - [C 言語 / 標準ライブラリ / math.h (Wikibooks)](https://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E/%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/math.h)
 - [z/OS C/C++ ランタイム・ライブラリー・リファレンス math.h &#x2014; 浮動小数点数学関数 (IBM)](https://www.ibm.com/docs/ja/zos/3.1.0?topic=files-mathh-floating-point-math-functions)
 - [C 言語の標準ヘッダ一覧 math.h (C 言語)](http://www.c-lang.org/detail/math_h.html)


---

[&#x21E6; インデックスへ](https://qiita.com/ht_deko/items/31f4b37daa97270e2416)


[^1]: C99 で追加された。