C++日本語リファレンスを読んでいて、意外に(特にC++17以降特殊関数が)色々あったので、自分用にバージョン別でまとめました
以降の説明で、
f(x,y) = z
と書いた場合は、特に断りのない場合、関数の入力がxとyで、出力がzと言う意味です。
全ての関数にC++日本語リファレンスへのリンクを埋め込んであります。
C++11以前から使える
数学関数
f(x) = |x|
f(x) = |x|
f(x) = \sqrt{x}
f(x) = e^x
f(x,y) = x^y
f(x) = \log_e x
f(x) = \log_{10}x
f(x) = \cos(x)
f(x) = \cos^{-1}(x)
f(x) = \sin (x)
f(x) = \sin^{-1}(x)
f(x) = \tan(x)
f(x) = \tan^{-1}(x)
f(y,x) = \tan^{-1}\left(\frac{y}{x}\right)
f(x) = \cosh(x)
f(x) = \sinh(x)
f(x) = \tanh(x)
剰余の計算
$f(x,y) = x/y$ の余り ($x$と同じ符号のものを返す)
浮動小数の演算
浮動小数点数を整数部と小数部に分解する。
$f(x,y) = z$の時、$z$は$x$と同じ符号の小数部分、$y$は$x$と同じ符号の整数部分 ($y$は出力)
浮動小数点数を仮数部と指数部へ分解する。
$f(x,y) = z$の時、$x=z \times 2^y ~ (1/2 \leq z < 1)$ となる$y$, $z$を返す ($y$は出力)
仮数部と指数部を入力して浮動小数点数を出力する
f(x, y) = x \times 2^{y}
C++11で追加
数学関数
f(x) = \sqrt[3]{x}
f(x) = \lceil x \rceil
$x$以上の最小の整数を返す
f(x) = \lfloor x \rfloor
$x$以下の最大の整数を返す
std::exp2
f(x) = 2^x
f(x) = e^x-1
$x \approx 0$でstd::exp(x)-1より高精度
f(x, y) = \text{max}(x-y, 0)
f(x,y,z) = x \times y + z
ハードウェアによる積和演算命令を使用できる場合は、使用する
その場合、コンパイル引数に -mfma
等が必要
単純な x*y+z
より早い場合はFP_FAST_FMA等のマクロが定義される
f(x,y) = \text{max}(x,y)
f(x,y) = \text{min}(x,y)
f(x,y) = \sqrt{x^2+y^2}
余計なオーバーフロー、アンダーフローを起こさない
C++17以降、$f(x,y,z) = \sqrt{x^2+y^2+z^2}$も使える
f(x) = \log_e (1+x)
$x \approx 0$でstd::log(1+x)より高精度
f(x) = \log_2 x
f(x) = \cosh^{-1}(x)
f(x) = \sinh^{-1}(x)
f(x) = \tanh^{-1}(x)
誤差関数
f(x) = \text{erf}x = \frac{2}{\sqrt{\pi}} \int_0^{x} e^{-t^2} dt
f(x) = \text{erfc}x = 1-\text{erf}x = \frac{2}{\sqrt{\pi}} \int_x^{\infty} e^{-t^2} dt
std::tgamma
ガンマ関数
f(x) = \Gamma(x) = \int_0^{\infty} dt ~ t^{x-1} e^{-t}
f(x) = \ln |\Gamma(x)|
剰余の計算
$x/y$ の余り (絶対値が最も小さくなるものを返す)
$x/y$の商と余りを求める
$f(x,y,z)=w$ の時、$w$はstd::remainder(x,y)と等しく、$z$は$x=y \times z+w$となる$z$が返る ($z$は出力)
整数にする演算
整数値に丸める
ゼロ方向に丸めた整数値を返す
整数値に丸める
四捨五入して整数値にする
long に丸める
四捨五入してlong にする
long long に丸める
四捨五入してlong long にする
浮動小数の演算
浮動小数点型の指数表現の基数FLT_RADIXに対する指数部を返す
浮動小数点型の指数表現の基数FLT_RADIXに対する指数部を返す
浮動小数点型の指数表現の基数FLT_RADIXに対して
f(x,n) = x \times (\text{FLT_RADIX})^n
を返す
判定
有限か判定する
無限大か判定する
符号が負か判定する
左辺が右辺より大きい(x > y)か判定する
左辺が右辺以上(x >= y)か判定する
左辺が右辺より小さい(x < y)か判定する
左辺が右辺より以下(x <= y)か判定する
左辺が右辺より小さい(x < y)、もしくは大きい(x > y)のいずれかであるかを判定する
数値がNaNであるか判定する
数値が正規化数であるか判定する
2つの引数が順序付けられていないないか判定する
その他
f(x,y)は、xの絶対値にyの符号がついたものを返す
f(x,y)は、xをyの方向に、表現可能な最小の値だけ進めた値を返す
f(x,y)は、xをyの方向に、表現可能な最小の値だけ進めた値を返す
数値分類を返す
文字列から qubit NaN へ変換する。
C++17で追加
数学関数
リーマンのゼータ関数
f(x) = \zeta (x) = \sum_{k=1}^{\infty} k^{-x}
ベータ関数
f(x,y) = \int_0^1 dt ~ t^{x-1} (1-t)^{y-1} = \frac{\Gamma(x)\Gamma(y)}{\Gamma(x+y)}
ルジャンドル多項式
f(l, x) = P_l(x) = \frac{1}{2^l l!}\frac{d^l}{dx^l}(x^2-1)^l
ルジャンドル陪関数
f(l, m, x) = P_l^m(x) = (1-x^2)^{m/2} \frac{d^m}{dx^m}P_l(x)
ラゲール多項式
f(n, x) = L_n(x) = \frac{e^x}{n!}\frac{d^n}{dx^n} (x^n e^{-x})
ラゲール陪多項式
f(n,m,x) = L_n^m(x) = (-1)^m \frac{d^m}{dx^m} L_{m+n}(x)
エルミート多項式
f(n,x) = H_n(x) = (-1)^n \exp (x^2) \frac{d^n}{dx^n} \exp(-x^2)
第一種ベッセル関数
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}
第一種変形ベッセル関数
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}
第二種ベッセル関数、ノイマン関数
f(\nu, x) = N_{\nu}(x) = \frac{J_{\nu}(x)\cos\nu\pi-J_{-\nu}(x)}{\sin\nu\pi}
第二種変形ベッセル関数
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}
第一種球ベッセル関数
f(n,x) = j_n(x) = \sqrt{\frac{\pi}{2x}} J_{n+1/2}(x)
球面調和関数の$\theta$成分
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)
第二種球ベッセル関数、球ノイマン関数
f(n,x) = n_n(x) = \sqrt{\frac{\pi}{2x}}N_{n+1/2}(x)
第一種不完全楕円積分
f(k, \phi) = F(k, \phi) = \int_0^{\phi} \frac{d\theta}{\sqrt{1-k^2 \sin^2 \theta}}
第一種完全楕円積分
f(k) = F(k,\pi/2) = \int_0^{\pi/2} \frac{d\theta}{\sqrt{1-k^2 \sin^2 \theta}}
第二種不完全楕円積分
f(k,\phi) = E(k, \phi) = \int_0^{\phi} d\theta ~ \sqrt{1-k^2\sin^2\theta}
第二種完全楕円積分
f(k) = E(k,\pi/2) = \int_0^{\pi/2} d\theta ~ \sqrt{1-k^2\sin^2\theta}
第三種不完全楕円積分
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}}
第三種完全楕円積分
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}}
指数積分
f(x) = Ei(x) = -\int_{-x}^{\infty} dt ~ \frac{e^{-t}}{t} = - \int_{-\infty}^{x} dt ~ \frac{e^t}{t}
C++20で追加
数学関数
線形補間
f(a,b,t) = a + t(b-a)