C++のcmathで扱える関数一覧


[C++日本語リファレンス](https://cpprefjp.github.io/reference/cmath)を読んでいて、意外に（特にC++17以降特殊関数が）色々あったので、自分用にバージョン別でまとめました

- [C++11以前から使える](#c11以前から使える)
  - [数学関数](#数学関数)
  - [浮動小数の演算](#浮動小数の演算)
  - [剰余の計算](#剰余の計算)
- [C++11で追加](#c11で追加)
  - [数学関数](#数学関数-1)
  - [剰余の計算](#剰余の計算-1)
  - [整数にする演算](#整数にする演算)
  - [浮動小数の演算](#浮動小数の演算-1)
  - [判定](#判定)
  - [その他](#その他)
- [C++17で追加](#c17で追加)
  - [数学関数](#数学関数-2)
- [C++20で追加](#c20で追加)
  - [数学関数](#数学関数-3)

以降の説明で、
f(x,y) = z
と書いた場合は、特に断りのない場合、関数の入力がxとyで、出力がzと言う意味です。

全ての関数にC++日本語リファレンスへのリンクを埋め込んであります。

# C++11以前から使える

## 数学関数

[std::abs](https://cpprefjp.github.io/reference/cmath/abs.html)

```math
f(x) = |x|
```

[std::fabs](https://cpprefjp.github.io/reference/cmath/fabs.html)

```math 
f(x) = |x|
```


[std::sqrt](https://cpprefjp.github.io/reference/cmath/sqrt.html)

```math 
f(x) = \sqrt{x}
```

[std::exp](https://cpprefjp.github.io/reference/cmath/exp.html)

```math 
f(x) = e^x
```

[std::pow](https://cpprefjp.github.io/reference/cmath/pow.html)

```math 
f(x,y) = x^y
```

[std::log](https://cpprefjp.github.io/reference/cmath/log.html)

```math 
f(x) = \log_e x
```

[std::log10](https://cpprefjp.github.io/reference/cmath/log10.html)

```math 
f(x) = \log_{10}x 
```

[std::cos](https://cpprefjp.github.io/reference/cmath/cos.html)

```math 
f(x) = \cos(x)
```

[std::acos](https://cpprefjp.github.io/reference/cmath/acos.html)

```math
f(x) = \cos^{-1}(x)
```

[std::sin](https://cpprefjp.github.io/reference/cmath/sin.html)

```math 
f(x) = \sin (x)
```

[std::asin](https://cpprefjp.github.io/reference/cmath/asin.html)

```math 
f(x) = \sin^{-1}(x)
```

[std::tan](https://cpprefjp.github.io/reference/cmath/tan.html)

```math 
f(x) = \tan(x)
```

[std::atan](https://cpprefjp.github.io/reference/cmath/atan.html)

```math 
f(x) = \tan^{-1}(x)
```

[std::atan2](https://cpprefjp.github.io/reference/cmath/atan2.html)

```math 
f(y,x) = \tan^{-1}\left(\frac{y}{x}\right)
```

[std::cosh](https://cpprefjp.github.io/reference/cmath/cosh.html)

```math 
f(x) = \cosh(x)
```

[std::sinh](https://cpprefjp.github.io/reference/cmath/sinh.html)

```math 
f(x) = \sinh(x)
```

[std::tanh](https://cpprefjp.github.io/reference/cmath/tanh.html)

```math 
f(x) = \tanh(x)
```


## 剰余の計算

[std::fmod](https://cpprefjp.github.io/reference/cmath/fmod.html)

$f(x,y) = x/y$ の余り ($x$と同じ符号のものを返す)

## 浮動小数の演算

[std::modf](https://cpprefjp.github.io/reference/cmath/modf.html)

浮動小数点数を整数部と小数部に分解する。
$f(x,y) = z$の時、$z$は$x$と同じ符号の小数部分、$y$は$x$と同じ符号の整数部分 ($y$は出力)

[std::frexp](https://cpprefjp.github.io/reference/cmath/frexp.html)

浮動小数点数を仮数部と指数部へ分解する。
$f(x,y) = z$の時、$x=z \times 2^y ~ (1/2 \leq z < 1)$ となる$y$, $z$を返す ($y$は出力)

[std::ldexp](https://cpprefjp.github.io/reference/cmath/ldexp.html)

仮数部と指数部を入力して浮動小数点数を出力する

```math 
f(x, y) = x \times 2^{y}
```

# C++11で追加

## 数学関数


[std::cbrt](https://cpprefjp.github.io/reference/cmath/cbrt.html)

```math 
f(x) = \sqrt[3]{x}
```

[std::ceil](https://cpprefjp.github.io/reference/cmath/ceil.html)

```math 
f(x) = \lceil x \rceil
```

$x$以上の最小の整数を返す

[std::floor](https://cpprefjp.github.io/reference/cmath/floor.html)

```math 
f(x) = \lfloor x \rfloor
```

$x$以下の最大の整数を返す
[std::exp2](https://cpprefjp.github.io/reference/cmath/exp2.html)

```math 
f(x) = 2^x
```

[std::expm1](https://cpprefjp.github.io/reference/cmath/expm1.html)

```math 
f(x) = e^x-1
```

$x \approx 0$でstd::exp(x)-1より高精度

[std::fdim](https://cpprefjp.github.io/reference/cmath/fdim.html)

```math 
f(x, y) = \text{max}(x-y, 0)
```

[std::fma](https://cpprefjp.github.io/reference/cmath/fma.html)

```math 
f(x,y,z) = x \times y + z
```

ハードウェアによる積和演算命令を使用できる場合は、使用する
その場合、コンパイル引数に `-mfma` 等が必要
単純な `x*y+z` より早い場合は[FP_FAST_FMA](https://cpprefjp.github.io/reference/cmath/fp_fast_fma.html)等のマクロが定義される


[std::fmax](https://cpprefjp.github.io/reference/cmath/fmax.html)

```math 
f(x,y) = \text{max}(x,y)
```

[std::fmin](https://cpprefjp.github.io/reference/cmath/fmin.html)

```math 
f(x,y) = \text{min}(x,y)
```

[std::hypot](https://cpprefjp.github.io/reference/cmath/hypot.html)

```math 
f(x,y) = \sqrt{x^2+y^2}
```

余計なオーバーフロー、アンダーフローを起こさない
C++17以降、$f(x,y,z) = \sqrt{x^2+y^2+z^2}$も使える

[std::log1p](https://cpprefjp.github.io/reference/cmath/log1p.html)

```math 
f(x) = \log_e (1+x)
```

$x \approx 0$でstd::log(1+x)より高精度

[std::log2](https://cpprefjp.github.io/reference/cmath/log2.html)

```math 
f(x) = \log_2 x
```

[std::acosh](https://cpprefjp.github.io/reference/cmath/acosh.html)

```math
f(x) = \cosh^{-1}(x)
```

[std::asinh](https://cpprefjp.github.io/reference/cmath/asinh.html)

```math 
f(x) = \sinh^{-1}(x)
```

[std::atanh](https://cpprefjp.github.io/reference/cmath/atanh.html)

```math 
f(x) = \tanh^{-1}(x)
```

[std::erf](https://cpprefjp.github.io/reference/cmath/erf.html)

誤差関数

```math 
f(x) = \text{erf}x = \frac{2}{\sqrt{\pi}} \int_0^{x} e^{-t^2} dt
```

[std::erfc](https://cpprefjp.github.io/reference/cmath/erfc.html)

```math 
f(x) = \text{erfc}x = 1-\text{erf}x = \frac{2}{\sqrt{\pi}} \int_x^{\infty} e^{-t^2} dt
```

[std::tgamma](https://cpprefjp.github.io/reference/cmath/tgamma.html)
ガンマ関数


```math 
f(x) = \Gamma(x) = \int_0^{\infty} dt ~ t^{x-1} e^{-t}
```

[std::lgamma](https://cpprefjp.github.io/reference/cmath/lgamma.html)

```math 
f(x) = \ln |\Gamma(x)| 
```


## 剰余の計算

[std::remainder](https://cpprefjp.github.io/reference/cmath/remainder.html)

$x/y$ の余り (絶対値が最も小さくなるものを返す)

[std::remquo](https://cpprefjp.github.io/reference/cmath/remquo.html)

$x/y$の商と余りを求める
$f(x,y,z)=w$ の時、$w$はstd::remainder(x,y)と等しく、$z$は$x=y \times z+w$となる$z$が返る ($z$は出力)


## 整数にする演算

[std::nearbyint](https://cpprefjp.github.io/reference/cmath/nearbyint.html)

整数値に丸める

[std::trunc](https://cpprefjp.github.io/reference/cmath/trunc.html)

ゼロ方向に丸めた整数値を返す

[std::rint](https://cpprefjp.github.io/reference/cmath/rint.html)

整数値に丸める

[std::round](https://cpprefjp.github.io/reference/cmath/round.html)

四捨五入して整数値にする

[std::lrint](https://cpprefjp.github.io/reference/cmath/lrint.html)

long に丸める

[std::lround](https://cpprefjp.github.io/reference/cmath/lround.html)

四捨五入してlong にする

[std::llrint](https://cpprefjp.github.io/reference/cmath/llrint.html)

long long に丸める

[std::llround](https://cpprefjp.github.io/reference/cmath/llround.html)

四捨五入してlong long にする

## 浮動小数の演算

[std::logb](https://cpprefjp.github.io/reference/cmath/logb.html)

浮動小数点型の指数表現の基数[FLT_RADIX](https://cpprefjp.github.io/reference/cfloat/flt_radix.html)に対する指数部を返す

[std::ilogb](https://cpprefjp.github.io/reference/cmath/ilogb.html)

浮動小数点型の指数表現の基数[FLT_RADIX](https://cpprefjp.github.io/reference/cfloat/flt_radix.html)に対する指数部を返す

[std::scalbn](https://cpprefjp.github.io/reference/cmath/scalbn.html)

浮動小数点型の指数表現の基数[FLT_RADIX](https://cpprefjp.github.io/reference/cfloat/flt_radix.html)に対して

```math 
f(x,n) = x \times (\text{FLT_RADIX})^n
```

を返す

## 判定

[std::isfinite](https://cpprefjp.github.io/reference/cmath/isfinite.html)

有限か判定する

[std::isinf](https://cpprefjp.github.io/reference/cmath/isinf.html)

無限大か判定する

[std::signbit](https://cpprefjp.github.io/reference/cmath/signbit.html)

符号が負か判定する

[std::isgreater](https://cpprefjp.github.io/reference/cmath/isgreater.html)

左辺が右辺より大きい(x > y)か判定する

[std::isgreaterequal](https://cpprefjp.github.io/reference/cmath/isgreaterequal.html)

左辺が右辺以上(x >= y)か判定する

[std::isless](https://cpprefjp.github.io/reference/cmath/isless.html)

左辺が右辺より小さい(x < y)か判定する

[std::islessequal](https://cpprefjp.github.io/reference/cmath/islessequal.html)

左辺が右辺より以下(x <= y)か判定する

[std::islessgreater](https://cpprefjp.github.io/reference/cmath/islessgreater.html)

左辺が右辺より小さい(x < y)、もしくは大きい(x > y)のいずれかであるかを判定する

[std::isnan](https://cpprefjp.github.io/reference/cmath/isnan.html)

数値がNaNであるか判定する

[std::isnormal](https://cpprefjp.github.io/reference/cmath/isnormal.html)

数値が正規化数であるか判定する

[std::isunordered](https://cpprefjp.github.io/reference/cmath/isunordered.html)

2つの引数が順序付けられていないないか判定する

## その他

[std::copysign](https://cpprefjp.github.io/reference/cmath/copysign.html)

f(x,y)は、xの絶対値にyの符号がついたものを返す

[std::nextafter](https://cpprefjp.github.io/reference/cmath/nextafter.html)

f(x,y)は、xをyの方向に、表現可能な最小の値だけ進めた値を返す

[std::nextforward](https://cpprefjp.github.io/reference/cmath/nexttoward.html)

f(x,y)は、xをyの方向に、表現可能な最小の値だけ進めた値を返す

[std::fpclassify](https://cpprefjp.github.io/reference/cmath/fpclassify.html)

数値分類を返す

[std::nan](https://cpprefjp.github.io/reference/cmath/nanf.html)

文字列から qubit NaN へ変換する。

# C++17で追加

## 数学関数

[std::riemann_zeta](https://cpprefjp.github.io/reference/cmath/riemann_zeta.html)

リーマンのゼータ関数

```math 
f(x) = \zeta (x) = \sum_{k=1}^{\infty} k^{-x}
```

[std::beta](https://cpprefjp.github.io/reference/cmath/beta.html)

ベータ関数

```math 
f(x,y) = \int_0^1 dt ~ t^{x-1} (1-t)^{y-1} = \frac{\Gamma(x)\Gamma(y)}{\Gamma(x+y)}
```

[std::legendre](https://cpprefjp.github.io/reference/cmath/legendre.html)

ルジャンドル多項式

```math 
f(l, x) = P_l(x) = \frac{1}{2^l l!}\frac{d^l}{dx^l}(x^2-1)^l
```

[std::assoc_legendre](https://cpprefjp.github.io/reference/cmath/assoc_legendre.html)

ルジャンドル陪関数

```math 
f(l, m, x) = P_l^m(x) = (1-x^2)^{m/2} \frac{d^m}{dx^m}P_l(x)
```

[std::laguerre](https://cpprefjp.github.io/reference/cmath/laguerre.html)

ラゲール多項式

```math 
f(n, x) = L_n(x) = \frac{e^x}{n!}\frac{d^n}{dx^n} (x^n e^{-x})
```

[std::assoc_laguerre](https://cpprefjp.github.io/reference/cmath/assoc_laguerre.html)

ラゲール陪多項式

```math 
f(n,m,x) = L_n^m(x) = (-1)^m \frac{d^m}{dx^m} L_{m+n}(x)
```

[std::hermite](https://cpprefjp.github.io/reference/cmath/hermite.html)

エルミート多項式

```math 
f(n,x) = H_n(x) = (-1)^n \exp (x^2) \frac{d^n}{dx^n} \exp(-x^2)
```

[std::cyl_bessel_j](https://cpprefjp.github.io/reference/cmath/cyl_bessel_j.html)

第一種ベッセル関数

```math 
f(\nu, x) = J_{\nu}(x) = \sum_{k=0}^{\infty} \frac{(-1)^k}{k!\Gamma(\nu+k+1)}\left(\frac{x}{2}\right)^{\nu+2k}
```

[std::cyl_bessel_i](https://cpprefjp.github.io/reference/cmath/cyl_bessel_i.html)

第一種変形ベッセル関数

```math 
f(\nu, x) = I_{\nu}(x) = i^{-v}J_{\nu}(ix) = \sum_{k=0}^{\infty} \frac{1}{k!\Gamma(v+k+1)}\left(\frac{x}{2}\right)^{\nu+2k}
```

[std::cyl_neumann](https://cpprefjp.github.io/reference/cmath/cyl_neumann.html)

第二種ベッセル関数、ノイマン関数

```math 
f(\nu, x) = N_{\nu}(x) = \frac{J_{\nu}(x)\cos\nu\pi-J_{-\nu}(x)}{\sin\nu\pi}
```

[std::cyl_bessel_k](https://cpprefjp.github.io/reference/cmath/cyl_bessel_k.html)

第二種変形ベッセル関数

```math 
f(\nu, x) = K_{\nu}(x) = \frac{\pi}{2}i^{\nu+1}(J_{\nu}(ix) + iN_{\nu}(ix)) = \frac{\pi}{2} \frac{I_{-\nu}(x)-I_{\nu}(x)}{\sin \nu \pi}
```

[std::sph_bessel](https://cpprefjp.github.io/reference/cmath/sph_bessel.html)

第一種球ベッセル関数

```math 
f(n,x) = j_n(x) = \sqrt{\frac{\pi}{2x}} J_{n+1/2}(x)
```

[std::sph_legendre](https://cpprefjp.github.io/reference/cmath/sph_legendre.html)

球面調和関数の$\theta$成分

```math 
f(l,m,\theta) = Y_l^m(\theta,0) = (-1)^m \sqrt{\frac{2l+1}{4\pi}\frac{(l-m)!}{(l+m)!}}P_l^m(\cos \theta)
```

[std::sph_neumann](https://cpprefjp.github.io/reference/cmath/sph_neumann.html)

第二種球ベッセル関数、球ノイマン関数

```math 
f(n,x) = n_n(x) = \sqrt{\frac{\pi}{2x}}N_{n+1/2}(x)
```

[std::ellint_1](https://cpprefjp.github.io/reference/cmath/ellint_1.html)

第一種不完全楕円積分

```math 
f(k, \phi) = F(k, \phi) = \int_0^{\phi} \frac{d\theta}{\sqrt{1-k^2 \sin^2 \theta}}
```

[std::comp_ellint_1](https://cpprefjp.github.io/reference/cmath/comp_ellint_1.html)

第一種完全楕円積分

```math 
f(k) = F(k,\pi/2) = \int_0^{\pi/2} \frac{d\theta}{\sqrt{1-k^2 \sin^2 \theta}}
```

[std::ellint_2](https://cpprefjp.github.io/reference/cmath/ellint_2.html)

第二種不完全楕円積分

```math 
f(k,\phi) = E(k, \phi) = \int_0^{\phi} d\theta ~ \sqrt{1-k^2\sin^2\theta}
```

[std::comp_ellint_2](https://cpprefjp.github.io/reference/cmath/comp_ellint_2.html)

第二種完全楕円積分

```math 
f(k) = E(k,\pi/2) = \int_0^{\pi/2} d\theta ~ \sqrt{1-k^2\sin^2\theta}
```

[std::ellint_3](https://cpprefjp.github.io/reference/cmath/ellint_3.html)

第三種不完全楕円積分

```math 
f(k,\nu,\phi) = \Pi(\nu, k, \phi) = \int_0^{\phi} \frac{d\theta}{(1-\nu\sin^2\theta)\sqrt{1-k^2\sin^2\theta}}
```

[std::comp_ellint_3](https://cpprefjp.github.io/reference/cmath/comp_ellint_3.html)

第三種完全楕円積分

```math 
f(k,\nu) = \Pi(\nu, k, \pi/2) = \int_0^{\pi/2} \frac{d\theta}{(1-\nu\sin^2\theta)\sqrt{1-k^2\sin^2\theta}}
```

[std::expint](https://cpprefjp.github.io/reference/cmath/expint.html)

指数積分

```math 
f(x) = Ei(x) = -\int_{-x}^{\infty} dt ~ \frac{e^{-t}}{t} = - \int_{-\infty}^{x} dt ~ \frac{e^t}{t}
```

# C++20で追加

## 数学関数

[std::lerp](https://cpprefjp.github.io/reference/cmath/lerp.html)

線形補間

```math 
f(a,b,t) = a + t(b-a)
```