LoginSignup
6
8

More than 3 years have passed since last update.

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

Posted at

C++日本語リファレンスを読んでいて、意外に(特にC++17以降特殊関数が)色々あったので、自分用にバージョン別でまとめました

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

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

C++11以前から使える

数学関数

std::abs

f(x) = |x|

std::fabs

f(x) = |x|

std::sqrt

f(x) = \sqrt{x}

std::exp

f(x) = e^x

std::pow

f(x,y) = x^y

std::log

f(x) = \log_e x

std::log10

f(x) = \log_{10}x 

std::cos

f(x) = \cos(x)

std::acos

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

std::sin

f(x) = \sin (x)

std::asin

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

std::tan

f(x) = \tan(x)

std::atan

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

std::atan2

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

std::cosh

f(x) = \cosh(x)

std::sinh

f(x) = \sinh(x)

std::tanh

f(x) = \tanh(x)

剰余の計算

std::fmod

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

浮動小数の演算

std::modf

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

std::frexp

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

std::ldexp

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

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

C++11で追加

数学関数

std::cbrt

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

std::ceil

f(x) = \lceil x \rceil

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

std::floor

f(x) = \lfloor x \rfloor

$x$以下の最大の整数を返す
std::exp2

f(x) = 2^x

std::expm1

f(x) = e^x-1

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

std::fdim

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

std::fma

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

ハードウェアによる積和演算命令を使用できる場合は、使用する
その場合、コンパイル引数に -mfma 等が必要
単純な x*y+z より早い場合はFP_FAST_FMA等のマクロが定義される

std::fmax

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

std::fmin

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

std::hypot

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

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

std::log1p

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

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

std::log2

f(x) = \log_2 x

std::acosh

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

std::asinh

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

std::atanh

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

std::erf

誤差関数

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

std::erfc

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}

std::lgamma

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

剰余の計算

std::remainder

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

std::remquo

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

整数にする演算

std::nearbyint

整数値に丸める

std::trunc

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

std::rint

整数値に丸める

std::round

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

std::lrint

long に丸める

std::lround

四捨五入してlong にする

std::llrint

long long に丸める

std::llround

四捨五入してlong long にする

浮動小数の演算

std::logb

浮動小数点型の指数表現の基数FLT_RADIXに対する指数部を返す

std::ilogb

浮動小数点型の指数表現の基数FLT_RADIXに対する指数部を返す

std::scalbn

浮動小数点型の指数表現の基数FLT_RADIXに対して

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

を返す

判定

std::isfinite

有限か判定する

std::isinf

無限大か判定する

std::signbit

符号が負か判定する

std::isgreater

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

std::isgreaterequal

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

std::isless

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

std::islessequal

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

std::islessgreater

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

std::isnan

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

std::isnormal

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

std::isunordered

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

その他

std::copysign

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

std::nextafter

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

std::nextforward

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

std::fpclassify

数値分類を返す

std::nan

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

C++17で追加

数学関数

std::riemann_zeta

リーマンのゼータ関数

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

std::beta

ベータ関数

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

std::legendre

ルジャンドル多項式

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

std::assoc_legendre

ルジャンドル陪関数

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

std::laguerre

ラゲール多項式

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

std::assoc_laguerre

ラゲール陪多項式

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

std::hermite

エルミート多項式

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

std::cyl_bessel_j

第一種ベッセル関数

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

第一種変形ベッセル関数

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

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

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

std::cyl_bessel_k

第二種変形ベッセル関数

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

第一種球ベッセル関数

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

std::sph_legendre

球面調和関数の$\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)

std::sph_neumann

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

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

std::ellint_1

第一種不完全楕円積分

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

std::comp_ellint_1

第一種完全楕円積分

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

std::ellint_2

第二種不完全楕円積分

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

std::comp_ellint_2

第二種完全楕円積分

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

std::ellint_3

第三種不完全楕円積分

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

第三種完全楕円積分

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

指数積分

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

C++20で追加

数学関数

std::lerp

線形補間

f(a,b,t) = a + t(b-a)
6
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8