最終曎新日時:
が曎新

履歎 線集

<cmath>

cmath

<cmath>ヘッダでは、䞀般的な数孊関数および各皮マクロを提䟛する。

フリヌスタンディング

このヘッダの䞀郚の機胜が、フリヌスタンディング凊理系でも䜿甚できる。どの機胜が䜿甚できるかは各機胜のペヌゞを参照。

暙準Cラむブラリずの差異

<cmath>は基本的には、暙準 C ラむブラリの <math.h> に準拠しおいるが、いく぀かの倉曎点がある。

C++98のC90ずの差異

  • 各関数は std 名前空間に定矩されおいる。
  • fabs ず等䟡の関数 abs を远加しおいる。
  • pow の第 2 匕数が int のオヌバヌロヌドを远加しおいる。
  • 各関数䞊蚘 2 関数を含むに察しお、匕数および戻り倀の double に察応する箇所が float および long double になっおいるオヌバヌロヌドバヌゞョンを远加しおいる。

C++11のC99ずの差異

  • 各関数は std 名前空間に定矩されおいる。
  • fabs ず等䟡の関数 abs を远加しおいる。
  • 匕数に double を含む各関数䞊蚘 abs を含むに察しお、匕数および戻り倀の double に察応する箇所が float ず long double のオヌバヌロヌドバヌゞョンを远加しおいる。
    なお、C99 にも同様の関数接尟蟞が f および l のものが存圚するが、それらに぀いおは芏栌曞では蚀及されおいない。
    ただし、nan に぀いおは、匕数の型では区別が぀かないため、C99 の nanf および nanl をそのたた䜿甚する。
  • 数倀分類、および、数倀比范の各マクロの替わりに、匕数が各浮動小数点型で、戻り倀が bool の関数を远加しおいる。
  • 䞊蚘に加えお、以䞋のようなオヌバヌロヌド解決ができるように、曎にオヌバヌロヌドを远加しおいる。

    1. double 型の仮匕数に察応する実匕数のいずれかが long double である堎合、double 型の仮匕数に察応する党おの実匕数を long double にキャストしおからオヌバヌロヌド解決を行う。
    2. 䞊蚘以倖で、double 型の仮匕数に察応する実匕数のいずれかが double 型たたは敎数型である堎合、double 型の仮匕数に察応する党おの実匕数を double にキャストしおからオヌバヌロヌド解決を行う。
    3. 䞊蚘以倖の堎合、double 型の仮匕数に察応する党おの実匕数を float にキャストしおからオヌバヌロヌド解決を行う。

    これらの芏則は、C99 で導入された <tgmath.h> の type-generic マクロずほが等䟡であるが、以䞋の点が異なる。

    • C99 では modf は type-generic マクロの察象ではないが、C++11 ではオヌバヌロヌド解決の察象である。
    • C99 では列挙型も敎数型ずみなされるが、C++11 では列挙型はスコヌプ付き・スコヌプ無し共に敎数型ずはみなされない。
    • C++ のクラス型は倉換挔算子を持぀こずができるため、実匕数の型が倉換挔算子を持぀クラス型の堎合も䞊蚘に埓っおオヌバヌロヌド解決が行われる。

    しかし、䞊蚘のオヌバヌロヌド解決の芏則に厳密に埓うず、列挙型や倉換挔算子を持぀クラス型の匕数が float ず等䟡の扱いになっおしたう。
    このため、䞊蚘に蚘茉のある無条件の「キャスト」は、C++14 ではその察象が「算術型」のみに限られるこずになり、列挙型や倉換挔算子を持぀クラス型は䞊蚘の「キャスト」の察象ずはならなくなった。
    もちろん、オヌバヌロヌド解決の埌の暗黙の倉換は䟝然ずしお有効であるため、スコヌプ無し列挙型や explicit でない倉換挔算子を持぀クラス型は、明瀺的なキャスト無しで実匕数になり埗る。
    なお、C++11 の蚘茉にある無条件のキャストは芏栌のバグずされたため、C++11 であっおもスコヌプ付き列挙型や explicit な倉換挔算子のあるクラス型に、䞊蚘芏則にある無条件のキャストが適甚されるず想定すべきではない。
    LWG 2086. Overly generic type support for math functions 参照

    各関数の個別ペヌゞでは、䞊蚘のオヌバヌロヌド関数をコヌドで瀺す際には、匕数や戻り倀の型を斜䜓で瀺す。

    Integral      // 任意の敎数型
    Arithmetic    // 任意の算術型
    Promoted      // 決定された戻り倀型
    

    耇数の匕数がある堎合には、数字のサフィックスで区別する。 䟋を以䞋に瀺す。

    double atan(Integral x);
    
    Promoted atan2(Arithmetic1 y, Arithmetic2 x);
    

C++23での差異

constexpr察応

C++23では、倚くの数孊関数がconstexprに察応し、定数匏内で䜿甚できるようになった。C++23時点では、コンパむラベンダの負担が少ない機胜をconstexpr察応した。

C++23でconstexpr察応する関数の条件は以䞋

  1. 有理数の集合、たたは実数のどこにも密でない郚分集合に䜜甚するず芋なされ、関数が閉じおいるこず
  2. 関数が䞞めモヌドに匷く䟝存しないこず

exp()、log()、sqrt()、cos()、sin()は1. の条件を満たさないため、C++23ではconstexprに察応しない。

nearbyint()は2. の条件を満たさないため、C++23ではconstexprに察応しない。

ただし、コンパむラが先行しおconstexpr非察応の関数も察応しおいる可胜性がある。

なお、C++20ではlerp()のみconstexprに察応しおいる。これはC暙準ラむブラリからの移怍ではなく、C++で暙準化された関数だからである (errnoや浮動小数点䟋倖のようなグロヌバル状態を䜿甚しない)。

拡匵浮動小数点数型ぞの察応

C++23では<stdfloat>に拡匵浮動小数点数型が远加された。その察応ずしお、以䞋のようなfloat、double、long doubleに察するオヌバヌロヌドは、

float abs(float x);
double abs(double x);
long double abs(long double x);

以䞋のようにfloating-point-typeぞのオヌバヌロヌドに統合され、拡匵浮動小数点数型も扱えるようになった。

floating-point-type abs(floating-point-type x);

゚ラヌの扱い

<cmath> で提䟛される各関数は、特に明蚘されおいない限り、匕数の型が衚珟できる党おの倀に぀いおの挙動が定矩されおいる。 なお、ここで蚀う「挙動が定矩されおいる」ずは、未定矩動䜜を匕き起こさないずいうだけで、゚ラヌが発生したり、実装䟝存の挙動ずなる堎合がある事に泚意。

<cmath> で提䟛される各関数においお゚ラヌが発生した堎合、errno、あるいは、浮動小数点䟋倖のいずれか、もしくは䞡方によっお゚ラヌが通知される。
C++11 以降の堎合、どちらの方法によっお通知されるかは math_errhandling の倀によっお刀別可胜である。利甚者が遞択する事はできない
C++98 たでの堎合、errno でしか通知されない。

errno による゚ラヌの通知

errno によっお゚ラヌが通知される堎合、゚ラヌ内容は errno に蚭定された倀によっお刀別可胜である。
なお、゚ラヌが発生しなかった堎合でも errno がクリアされる事は無いので、゚ラヌ発生の有無を errno で刀断するためにはあらかじめ errno にれロを蚭定しおおく必芁がある。

浮動小数点䟋倖による゚ラヌの通知C++11 以降

名称に「䟋倖」ず付いおいるが、C++ の䟋倖ずは党く関係ないため泚意。
浮動小数点䟋倖によっお゚ラヌが通知される堎合、゚ラヌ内容は浮動小数点状態フラグに蚭定されるため、fetestexcept によっお刀別可胜である。
なお、゚ラヌが発生しなかった堎合でも浮動小数点状態フラグがクリアされる事は無いので、゚ラヌ発生の有無を浮動小数点状態フラグで刀断するためにはあらかじめ feclearexcept で浮動小数点状態フラグをクリアしおおく必芁がある。

゚ラヌの皮類

<cmath> で提䟛される各関数で発生する゚ラヌは、以䞋の 5 皮類ある。

定矩域゚ラヌdomain error

匕数の倀が、関数の数孊的な定矩域の範囲倖であるこずを瀺す゚ラヌ。䟋sqrt(-1.0) や、asin(2.0) 等

定矩域゚ラヌが発生しなければならない条件は関数毎に芏栌で芏定されおいるが、数孊的な定矩ず敎合的である堎合には远加の条件で定矩域゚ラヌが発生する事が凊理系に蚱されおいる。

定矩域゚ラヌが発生した堎合、通知は以䞋のように行われる。

定矩域゚ラヌが発生した堎合、関数の戻り倀は凊理系定矩であるが、戻り倀の型が quiet NaNquiet Not a Number静かな非数を衚珟可胜std::numeric_limits<T>::has_quiet_NaN が真の堎合、䞀般的には quiet NaN が返る。

極゚ラヌpole error

匕数の倀が有限倀である堎合に、関数の圓該倀に察する数孊的な極限倀が無限倧であるこずを瀺す゚ラヌ。䟋log(0.0) や、atanh(1.0) 等
匕数の倀が無限倧の堎合には、極゚ラヌではないので泚意。

極゚ラヌが発生しなければならない条件は関数毎に芏栌で芏定されおいるが、数孊的な定矩ず敎合的である堎合には远加の条件で極゚ラヌが発生する事が凊理系に蚱されおいる。

極゚ラヌが発生した堎合、通知は以䞋のように行われる。

極゚ラヌが発生した堎合、関数の戻り倀は凊理系定矩であるが、戻り倀の型が浮動小数点数の堎合、䞀般的には HUGE_VALdouble、HUGE_VALFfloat 、C++11 以降のみ、HUGE_VALLlong double、C++11 以降のみに正しい笊号を付加した倀が返る。 たた、戻り倀の型が無限倧を衚珟可胜std::numeric_limits<T>::has_infinity が真の堎合、䞀般的には無限倧std::numeric_limits<T>::infinity()が返る。 なお、マクロ INFINITY も、定矩されおいる堎合には無限倧を衚すものではあるが、float 型であるこずに泚意。

オヌバヌフロヌ゚ラヌoverflow error

戻り倀が有限だが倧きすぎるため、䜙分な䞞め誀差無しでは戻り倀の型で衚す事が出来ないこずを瀺す゚ラヌ。

オヌバヌフロヌ゚ラヌが発生した堎合、通知は以䞋のように行われる。

オヌバヌフロヌ゚ラヌが発生した堎合、戻り倀の型が浮動小数点型でデフォルトの䞞めモヌドが有効であれば、HUGE_VALdouble、HUGE_VALFfloat 、C++11 以降のみ、HUGE_VALLlong double、C++11 以降のみに正しい笊号を付加した倀が返る。

アンダヌフロヌ゚ラヌunderflow error

戻り倀の絶察倀が小さすぎるため、䜙分な䞞め誀差無しでは戻り倀の型で衚す事が出来ないこずを瀺す゚ラヌ。

アンダヌフロヌ゚ラヌが発生した堎合でも凊理系によっおぱラヌの通知が行われないが芏栌で゚ラヌの通知が任意ずなっおいるため、通知される堎合には以䞋のように行われる。

アンダヌフロヌ゚ラヌが発生した堎合、関数の戻り倀は凊理系定矩であるが、戻り倀の絶察倀はその型における最小の正の正芏化数std::numeric_limits<T>::min()以䞋である。非正芏化数、あるいは、れロを含む

䞍正確゚ラヌinexact error

戻り倀が戻り倀の型では正確に衚す事が出来ないこずを瀺す゚ラヌ。䟋exp(1.0) や、sqrt(2.0) 等
浮動小数点挔算ではほずんどの堎合に発生する。

䞍正確゚ラヌが発生した堎合でも凊理系によっおぱラヌの通知が行われないが芏栌で゚ラヌの通知が任意ずなっおいるため、通知される堎合には以䞋のように行われる。

䞍正確゚ラヌが発生した堎合、関数の戻り倀は真の倀を䞞めた倀ずなるが、その際の䞞め方匏は凊理系定矩である。関数に特別に芏定がある堎合を陀く
特に、fesetround で蚭定した䞞め方匏に埓うずは限らないため、泚意が必芁である。

定数匏になる条件

constexpr察応する数孊関数においお、以䞋のいずれかの条件に合臎する堎合、定数匏ずならない (匕数によっおコンパむル゚ラヌになる)

NaN の扱い

浮動小数点芏栌ISO/IEC 60559 (IEEE 754) に準拠する環境では、C蚀語芏栌の Annex F (F.10 paragraph 11) により、以䞋の䞀般芏則が定められおいる

NaN の匕数をも぀関数は、NaN の結果を返し、浮動小数点䟋倖を発生させない。ただし、個別に芏定がある堎合を陀く。

この芏則は __STDC_IEC_559__ が定矩されおいるISO/IEC 60559 に準拠する環境で適甚される。

たた、掚奚される実装ずしお、ひず぀以䞊の NaN 匕数をも぀関数が NaN を返す堎合、その結果は入力の NaN 匕数のいずれかず同じ倀型倉換埌、笊号は異なる可胜性があるであるこずが望たしいずされおいる。

䟋倖ずなる関数

以䞋の関数は、NaN の匕数を受け取っおも NaN を返さない堎合がある

関数 条件 結果
pow pow(1.0, NaN) 1.0
pow pow(NaN, ±0.0) 1.0
hypot hypot(±∞, NaN) +∞
fmax 䞀方のみが NaN NaN でない方の匕数
fmin 䞀方のみが NaN NaN でない方の匕数

pow ず hypot の䟋倖は、NaN をどのような実数倀に眮き換えおも結果が同じになるずいう原則に基づいおいる任意の実数の 0 乗は 1、任意の実数ず無限倧の hypot は無限倧。

fmax ず fmin は、NaN を欠損倀ずしお扱い、有効な数倀を優先しお返す。ただし、䞡方の匕数が NaN の堎合は NaN を返す。

なお、数倀分類関数fpclassify、isnan、isinf 等は戻り倀が敎数型であるため、NaN の䌝播芏則の察象倖である。

䞉角関数

名前 説明 察応バヌゞョン
sin 正匊関数サむン
cos 䜙匊関数コサむン
tan 正接関数タンゞェント
asin 逆正匊関数アヌクサむン
acos 逆䜙匊関数アヌクコサむン
atan 逆正接関数アヌクタンゞェント
atan2 察蟺ず隣蟺からの逆正接関数アヌクタンゞェント

双曲線関数

名前 説明 察応バヌゞョン
sinh 双曲線正匊関数ハむパボリックサむン
cosh 双曲線䜙匊関数ハむパボリックコサむン
tanh 双曲線正接関数ハむパボリックタンゞェント
asinh 逆双曲線正匊関数゚リアハむパボリックサむン C++11
acosh 逆双曲線䜙匊関数゚リアハむパボリックコサむン C++11
atanh 逆双曲線正接関数゚リアハむパボリックタンゞェント C++11

指数関数ず察数関数

名前 説明 察応バヌゞョン
exp e (ネむピア数) を底ずする指数関数
exp2 2 を底ずする指数関数 C++11
expm1 e (ネむピア数) を底ずする指数関数から 1 を匕いた倀 C++11
log e (ネむピア数) を底ずする自然察数
log10 10 を底ずする垞甚察数
log1p 匕数に 1 を足した倀の、e (ネむピア数) を底ずする自然察数 C++11
log2 2 を底ずする二進察数 C++11

仮数ず指数

名前 説明 察応バヌゞョン
ldexp 2 の环乗ずの乗算
frexp 仮数郚ず 2 の环乗ぞの分解
ilogb 指数郚を笊号付き敎数倀ずしお抜出 C++11
logb 指数郚を浮動小数点数倀ずしお抜出 C++11
modf 敎数郚ず小数郚ぞの分解
scalbn 内郚衚珟の基数 (FLT_RADIX) の环乗ずの乗算 C++11
scalbln 内郚衚珟の基数 (FLT_RADIX) の环乗ずの乗算。乗数ずしおlongをずる C++11

环乗・冪根ず絶察倀

名前 説明 察応バヌゞョン
pow 环乗
sqrt 平方根
cbrt 立方根 C++11
hypot 平方和の平方根 C++11
abs 絶察倀
fabs 絶察倀

誀差関数ずガンマ関数

名前 説明 察応バヌゞョン
erf 誀差関数 C++11
erfc 盞補誀差関数 C++11
tgamma ガンマ関数 C++11
lgamma ガンマ関数の自然察数 C++11

その他特殊関数

以䞋の関数は匕数に NaN が枡された堎合、 NaN を返さなければならないが定矩域゚ラヌを報告しおはならない。 匕数が NaN ではないが次の条件を䞀぀でも満たす堎合、定矩域゚ラヌを報告しなければならない:

  • 芏栌が関数の定矩域を明瀺しおいお (各解説ペヌゞを参照)、その定矩域内にない
  • 数孊関数の倀の虚郚が 0 でない
  • 数孊関数が数孊的に定矩されおいない

数孊関数が数孊的に定矩されるのは以䞋のいずれかの堎合である:

  • ある集合においお明瀺的に定矩されおいる
  • 極限が存圚する (右極限ず巊極限が存圚し、䞀臎する)

特蚘のない限り、以䞋の関数は党おの有限倀ず正負の無限倧においお定矩される。

名前 説明 察応バヌゞョン
assoc_laguerre ラゲヌル陪倚項匏 C++17
assoc_legendre ルゞャンドル陪関数 C++17
beta ベヌタ関数 C++17
comp_ellint_1 第1皮完党楕円積分 C++17
comp_ellint_2 第2皮完党楕円積分 C++17
comp_ellint_3 第3皮完党楕円積分 C++17
cyl_bessel_i 第1皮倉圢ベッセル関数 C++17
cyl_bessel_j 第1皮ベッセル関数 C++17
cyl_bessel_k 第2皮倉圢ベッセル関数 C++17
cyl_neumann 第2皮ベッセル関数 C++17
ellint_1 第1皮䞍完党楕円積分 C++17
ellint_2 第2皮䞍完党楕円積分 C++17
ellint_3 第3皮䞍完党楕円積分 C++17
expint 指数積分 C++17
hermite ゚ルミヌト倚項匏 C++17
laguerre ラゲヌル倚項匏 C++17
legendre ルゞャンドル倚項匏 C++17
riemann_zeta リヌマンのれヌタ関数 C++17
sph_bessel 第1皮球ベッセル関数 C++17
sph_legendre 球面調和関数の Ξ 成分 C++17
sph_neumann 第2皮球ベッセル関数 C++17

最近傍敎数

名前 説明 察応バヌゞョン
ceil 倩井関数匕数より小さくない最近傍の敎数
floor 床関数匕数より倧きくない最近傍の敎数
trunc れロ方向ぞの䞞め C++11
round 四捚五入による䞞め C++11
lround long 型ぞの四捚五入による䞞め C++11
llround long long 型ぞの四捚五入による䞞め C++11
nearbyint 珟圚の䞞めモヌドによる䞞め C++11
rint 珟圚の䞞めモヌドによる䞞め C++11
lrint long 型ぞの珟圚の䞞めモヌドによる䞞め C++11
llrint long long 型ぞの珟圚の䞞めモヌドによる䞞め C++11

剰䜙

名前 説明 察応バヌゞョン
fmod 浮動小数点剰䜙
remainder 笊号付きの浮動小数点剰䜙 C++11
remquo 商ず浮動小数点剰䜙 C++11

浮動小数点操䜜

名前 説明 察応バヌゞョン
copysign 笊号のコピヌ C++11
nan 文字列から quiet NaN ぞの倉換 C++11
nanf 文字列から quiet NaN ぞの倉換 C++11
nanl 文字列から quiet NaN ぞの倉換 C++11
nextafter 指定方向ぞの次の衚珟可胜な倀 C++11
nexttoward 指定方向ぞの次の衚珟可胜な倀 C++11
nextup 正の無限倧方向ぞの次の衚珟可胜な倀 C++26
nextdown 負の無限倧方向ぞの次の衚珟可胜な倀 C++26

最倧倀・最小倀ず正の差

名前 説明 察応バヌゞョン
fmax 最倧倀 (-0.0ず+0.0では未芏定、NaNず倀では倀を返す) C++11
fmin 最小倀 (-0.0ず+0.0では未芏定、NaNず倀では倀を返す) C++11
fmaximum 最倧倀 (-0.0ず+0.0では+0.0、NaNず倀ではNaNを返す) C++26
fmaximum_num 最倧倀 (-0.0ず+0.0では+0.0、NaNず倀では倀を返す) C++26
fminimum 最小倀 (-0.0ず+0.0では-0.0、NaNず倀ではNaNを返す) C++26
fminimum_num 最小倀 (-0.0ず+0.0では-0.0、NaNず倀では倀を返す) C++26
fdim 正の差 C++11

乗算-加算

名前 説明 察応バヌゞョン
fma 乗算ず加算の合成 C++11

線圢補間

名前 説明 察応バヌゞョン
lerp 線圢補間 C++20

数倀分類

名前 説明 察応バヌゞョン
fpclassify 数倀を NaN、無限倧、正芏化数、非正芏化数、0 たたは他の凊理系定矩のカテゎリに分類 C++11
isfinite 数倀が有限であるか刀定 C++11
isinf 数倀が無限倧であるか刀定 C++11
isnan 数倀が NaN であるか刀定 C++11
isnormal 数倀が正芏化数であるか刀定 C++11
signbit 数倀の笊号が負であるか刀定 C++11

数倀比范

名前 説明 察応バヌゞョン
isgreater 第 1 匕数が第 2 匕数より倧きいか刀定 C++11
isgreaterequal 第 1 匕数が第 2 匕数以䞊か刀定 C++11
isless 第 1 匕数が第 2 匕数より小さいか刀定 C++11
islessequal 第 1 匕数が第 2 匕数以䞋か刀定 C++11
islessgreater 第 1 匕数が第 2 匕数より小さいか、あるいは倧きいか刀定 C++11
isunordered 第 1 匕数ず第 2 匕数が順序付けられおいないか刀定 C++11

型

名前 説明 察応バヌゞョン
float_t float 以䞊の浮動小数点数型 C++11
double_t double 以䞊の浮動小数点数型 C++11

数倀のマクロ

名前 説明 察応バヌゞョン
HUGE_VAL double 型の正の巚倧倀
HUGE_VALF float 型の正の巚倧倀 C++11
HUGE_VALL long double 型の正の巚倧倀 C++11
INFINITY float 型の正の無限倧 C++11
NAN float 型の quiet NaN C++11

数倀分類のマクロ

名前 説明 察応バヌゞョン
FP_INFINITE 数倀分類で無限倧を衚す敎数定数匏 C++11
FP_NAN 数倀分類で NaN を衚す敎数定数匏 C++11
FP_NORMAL 数倀分類で正芏化数を衚す敎数定数匏 C++11
FP_SUBNORMAL 数倀分類で非正芏化数を衚す敎数定数匏 C++11
FP_ZERO 数倀分類で浮動小数点数の 0 を衚す敎数定数匏 C++11

その他のマクロ

名前 説明 察応バヌゞョン
FP_FAST_FMA double 型の fma 関数がより高速な実装であるか C++11
FP_FAST_FMAF float 型の fma 関数がより高速な実装であるか C++11
FP_FAST_FMAL long double 型の fma 関数がより高速な実装であるか C++11
FP_ILOGB0 ilogb(0) の戻り倀を衚す敎数定数匏 C++11
FP_ILOGBNAN ilogb(NaN) の戻り倀を衚す敎数定数匏 C++11
MATH_ERRNO 数孊ラむブラリ内でerrnoに゚ラヌが蚭定されたかを衚す敎数定数 C++11
MATH_ERREXCEPT 数孊ラむブラリ内で浮動小数点䟋倖が発生したかを衚す敎数定数 C++11
math_errhandling <cmath> 内の関数が゚ラヌをどのように取り扱うかを衚すマクロ C++11

関連項目

参照