C数学関数
| C標準ライブラリ(libc) |
|---|
| 一般的なトピック |
| その他のヘッダー |
C言語の数学演算は、 C言語の標準ライブラリに含まれる関数群であり、 基本的な数学関数を実装しています。[1] [2] C言語の標準規格によって、後方互換性はあるものの、異なる関数群が提供されています。これらの関数のほとんどは、 C++標準ライブラリでも利用可能ですが、ヘッダーは異なります(C言語のヘッダーも含まれていますが、これは非推奨の互換性機能としてのみ提供されています)。
機能の概要
浮動小数点数を扱う数学関数のほとんどは、 <math.h>( C++ではヘッダー)で定義されています。整数<cmath>を扱う関数( 、、、、など)は、ヘッダー(C++ではヘッダー)で定義されています。abslabsdivldiv<stdlib.h><cstdlib>
角度を操作する関数はすべて、角度の単位としてラジアンを使用します。 [1]
これらの関数のすべてがC89版標準で利用できるわけではありません。利用できる関数であっても、double浮動小数点引数として型のみを受け入れるため、単精度値を使用するコードでは、高価な型変換が必要になります。C99では、この欠点は、引数と引数をfloat扱う新しい関数群を導入することで修正されました。これらの関数は、それぞれ接尾辞と接尾辞で識別されます。[3]floatlong doublefl
| 関数 | 説明 | |
|---|---|---|
abslabsllabs | 整数値の絶対値を計算する | |
fabs | 浮動小数点値の絶対値を計算します | |
divldivlldiv | 整数除算の商と余りを計算します | |
fmod | 浮動小数点除算演算の剰余 | |
remainder | 除算演算の符号付き剰余 | |
remquo | 符号付き剰余と除算演算の最後の3ビット | |
fma | 融合乗算加算演算 | |
fmax | 2つの浮動小数点値のうち大きい方 | |
fmin | 2つの浮動小数点値のうち小さい方 | |
fdim | 2つの浮動小数点値の正の差 | |
nannanfnanl | NaN(非数)を返します | |
| 指数 関数 | exp | eを指定されたべき乗で返します |
exp2 | 2の指定された累乗を返します | |
expm1 | e を指定された乗数から 1 を引いた値を返します。 | |
log | 自然対数(eを底とする)を計算します | |
log2 | 2を底とする2進対数を計算します | |
log10 | 常用対数(10を底とする)を計算します | |
log1p | 1 に指定された数値を加えた値の自然対数(底 e)を計算します。 | |
ilogb | 数値の指数を抽出します | |
logb | 数値の指数を抽出します | |
| べき乗 関数 | sqrt | 平方根を計算する |
cbrt | 立方根を計算する | |
hypot | 与えられた2つの数値の平方の合計の平方根を計算します | |
pow | 与えられた数をべき乗する[4] | |
| 三角 関数 | sin | 正弦を計算する |
cos | コサインを計算する | |
tan | 接線を計算する | |
asin | 逆正弦を計算する | |
acos | 逆余弦を計算する | |
atan | 逆正接を計算する | |
atan2 | 符号を使用して象限を決定する逆正接を計算します | |
| 双曲線 関数 | sinh | 双曲線正弦を計算する |
cosh | 双曲線余弦を計算する | |
tanh | 双曲線正接を計算する | |
asinh | 双曲線逆正弦を計算します | |
acosh | 双曲線逆余弦を計算する | |
atanh | 双曲線逆正接を計算する | |
| 誤差関数と ガンマ 関数 | erf | 誤差関数を計算する |
erfc | 相補誤差関数を計算する | |
lgamma | ガンマ関数の絶対値の自然対数を計算する | |
tgamma | ガンマ関数を計算する | |
| 最も近い 整数 浮動 小数点 演算 | ceil | 指定された値以上の最も近い整数を返します |
floor | 指定された値以下の最も近い整数を返します | |
trunc | 指定された値より大きくない最も近い整数を返します | |
roundlroundllround | 最も近い整数を返します。中間の場合はゼロから離れて丸めます。 | |
nearbyint | 現在の丸めモードを使用して最も近い整数を返します | |
rintlrintllrint | 現在の丸めモードを使用して最も近い整数を返します。結果が異なる場合は例外です。 | |
| 浮動 小数点 操作 関数 | frexp | 数値を仮数部と2の累乗に分解する |
ldexp | 数を2のべき乗で乗算する | |
modf | 数値を整数部と小数部に分解する | |
scalbnscalbln | FLT_RADIXのべき乗で数値を乗算します | |
nextafternexttoward | 指定された値に対して、次に表現可能な浮動小数点値を返します。 | |
copysign | 浮動小数点値の符号をコピーします | |
| 分類 | fpclassify | 与えられた浮動小数点値を分類する |
isfinite | 引数が有限値を持つかどうかをチェックする | |
isinf | 引数が無限かどうかをチェックする | |
isnan | 引数がNaNかどうかをチェックする | |
isnormal | 引数が正規かどうかをチェックする | |
signbit | 引数の符号が負かどうかをチェックします |
浮動小数点環境
C99では、浮動小数点環境をきめ細かく制御するための関数と型がいくつか追加されています。[3]これらの関数は、丸めモード、例外が発生する条件、数値がゼロにフラッシュされるタイミングなど、浮動小数点計算に影響するさまざまな設定を制御するために使用できます。浮動小数点環境の関数と型は、<fenv.h>ヘッダー(<cfenv>C ++)で定義されています。
| 関数 | 説明 |
|---|---|
feclearexcept | 例外をクリアする(C99) |
fegetenv | 現在の浮動小数点環境を保存する(C99) |
fegetexceptflag | 現在のステータスフラグを格納する(C99) |
fegetround | 現在の丸め方向を取得します(C99) |
feholdexcept | 現在の浮動小数点環境を保存し、すべての例外をクリアします(C99) |
feraiseexcept | 浮動小数点例外を発生させる(C99) |
fesetenv | 現在の浮動小数点環境を設定する(C99) |
fesetexceptflag | 現在のステータスフラグを設定する(C99) |
fesetround | 現在の丸め方向を設定する(C99) |
fetestexcept | 特定の例外が発生したかどうかをテストします(C99) |
feupdateenv | 浮動小数点環境を復元しますが、現在の例外は保持します(C99) |
複素数
C99では、複素数をサポートする新しい_Complexキーワード(およびcomplex便利なマクロ。ヘッダーがインクルードされている場合にのみ利用可能)が追加されました。任意の浮動小数点型は で変更でき、 は浮動小数点数のペアとして定義されます。C99とC++は複素数をコード互換性のある方法で実装していないことに注意してください。後者は代わりに クラスを提供します。<complex.h>complexstd::complex
複素数に対するすべての演算は<complex.h>ヘッダーで定義されています。実数値関数と同様に、接尾辞「fまたは」は関数の
「または」型lを表します。float complexlong double complex
| 関数 | 説明 | |
|---|---|---|
| 基本 操作 | cabs | 絶対値を計算する(C99) |
carg | 複素数の引数を計算する(C99) | |
cimag | 複素数の虚数部を計算する( C99) | |
creal | 複素数の実部を計算する( C99) | |
conj | 複素共役を計算する(C99) | |
cproj | リーマン球面への複素射影を計算する(C99) | |
| 指数 演算 | cexp | 複素指数を計算する(C99) |
clog | 複素対数を計算する(C99) | |
csqrt | 複素数の平方根を計算する(C99) | |
cpow | 複素数べき乗を計算する(C99) | |
| 三角関数の 演算 | csin | 複素正弦を計算する(C99) |
ccos | 複素余弦を計算する(C99) | |
ctan | 複素正接を計算する(C99) | |
casin | 複素逆正弦を計算する(C99) | |
cacos | 複素逆余弦を計算する(C99) | |
catan | 複素逆正接を計算する(C99) | |
| 双曲線 演算 | csinh | 複素双曲線正弦を計算する(C99) |
ccosh | 複素双曲線余弦を計算する(C99) | |
ctanh | 複素双曲正接を計算する(C99) | |
casinh | 複素双曲線逆正弦を計算する(C99) | |
cacosh | 複素双曲線逆余弦を計算する(C99) | |
catanh | 複素双曲逆正接を計算する(C99) |
より複雑な関数は「C99での将来の使用のために予約済み」となっています。[5]実装は標準ライブラリに含まれていないオープンソースプロジェクトによって提供されています。
| 関数 | 説明 | |
|---|---|---|
| 誤差関数 | cerf | 複素誤差関数を計算する(C99) |
cerfc | 複素相補誤差関数(C99) を計算する |
型ジェネリック関数
ヘッダーは、および<tgmath.h>で定義されている各数学関数に対して型汎用マクロを定義します。これにより、数学関数の関数オーバーロードに対する限定的なサポートが追加されます。つまり、同じ関数名を異なる型のパラメータで使用できます。実際の関数は、パラメータの型に応じてコンパイル時に選択されます。<math.h><complex.h>
実数と複素数の両方に対して定義された関数に対応する各型汎用マクロは、合計6つの異なる関数( 、float、doubleおよびlong doubleそれらのcomplexバリアント)をカプセル化します。実数のみに対して定義された関数に対応する型汎用マクロは、合計3つの異なる関数( 、float、doubleおよびlong doubleのバリアント)をカプセル化します。
C++ 言語には関数オーバーロードのネイティブ サポートが含まれているため、<tgmath.h>互換性機能としてもヘッダーは提供されません。
乱数生成
ヘッダー<stdlib.h>(<cstdlib>C++)は統計的に乱数を生成するために使用できるいくつかの関数を定義します。[6]
| 関数 | 説明 |
|---|---|
rand | 0 から までの疑似乱数を生成しますRAND_MAX。 |
srand | 疑似乱数ジェネレータを初期化する |
arc4random | 0から の間の疑似乱数を生成するUINT32_MAX。通常は、rand |
arc4random_uniform | 0 から最大値までの間の疑似乱数を生成します。 |
arc4random_buf | 疑似ランダム ビット ストリームでバッファを埋めます。 |
arc4random_stir | 疑似乱数ジェネレータを初期化します。 |
arc4random乱数関数群はPOSIX標準では定義されていませんが、いくつかの一般的な実装で見られます。かつてはRC4暗号の漏洩版(そのため「a lleged RC4libc 」)のキーストリーム生成器を指していましたが、その後、 ChaCha20などの他の暗号の異なるアルゴリズムが同じ名前で実装されるようになりました。
からの乱数性randは通常、統計的にランダムと見なすには弱すぎるため、明示的なシード値の設定が必要です。可能な場合はarc4random、 の代わりにを使用することが推奨されますrand。一部のCライブラリでは、内部的に を実装していrandますarc4random_uniform。
実装
LinuxやBSDなどのPOSIXシステムでは、数学関数( で宣言されている)は数学ライブラリ に別途バンドルされています。したがって、これらの関数のいずれかを使用する場合は、リンカーにディレクティブ を指定する必要があります。実装には様々なものがあり、例えば以下のようなものがあります。<math.h>libm-lmlibm
- GNU libcの libm
- AMDのlibm、github、Windowsでほぼそのまま使用される
- インテル C++ コンパイラlibm
- Red Hatの libm (Newlib)
- SunのFDLIBMはFreeBSDのmsunとOpenBSDのlibmのベースとして使用され、どちらもJuliaのOpenLibmのベースになりました。
- muslのlibmはBSD
libmsやArmなどのプロジェクトに基づいています - LLVMのlibmは正しく丸められています(つまり、数学的に正しい結果からの誤差は最終的に0.5単位未満です)[7]
- Arénaire プロジェクトの CRlibm (正しく丸められた libm) とその後継の MetaLibm は、Remez アルゴリズムを使用して、正式に証明された近似値を自動的に生成します。
- RutgerのRLIBMは単精度で正しく丸められた関数を提供します。[8]
必ずしも の名前で実装されるわけではないものにはlibm次のものがあります:
- Armの最適化された数学ルーチン
- GCE-Mathは、C++用に書かれたC/C++の数学関数のバージョンです
constexpr(コンパイル時計算)。 - CORE-MATH、単精度および倍精度に正しく丸められます。
- SIMD(ベクトル化)数学ライブラリには、SLEEF、Yeppp! Archived 2020-07-14 at the Wayback Machine、Agner Fogの VCL のほか、SVML や DirectXMath などのクローズドソースのライブラリもいくつかある。[9]
参照
参考文献
- ^ ab ISO/IEC 9899:1999 仕様(PDF)。p. 212、§ 7.12。
- ^ Prata, Stephen (2004). C primer plus . Sams Publishing. 付録B, セクションV: C99追加機能を備えた標準ANSI Cライブラリ. ISBN 0-672-32696-5。
- ^ ab Prata, Stephen (2004). C primer plus . Sams Publishing. 付録B, セクションVIII: C99数値計算の拡張. ISBN 0-672-32696-5。
- ^ 記法上、平方数や立方数を計算するのに pow( x ,2) や pow( x ,3) を使うのは便利に見えるかもしれません。しかし、時間的にクリティカルなコードでは、これは推奨されません。実装においてコンパイル時にこれらのケースに特別な配慮がされない限り、x * xやx * x * xの方がはるかに高速に実行されます。また、 pow( x ,.5) や pow( x ,1./3) よりも sqrt( x ) や cbrt( x ) の方が推奨されます。
- ^ man cerf(3)、man cerfc(3)、例えば https://linux.die.net/man/3/cerf を参照してください。
- ^ 「GNU Cライブラリ – ISO Random」 。 2018年7月18日閲覧。
- ^ 「数学関数 - LLVM Cライブラリ」. libc.llvm.org .
- ^ 「RLibm: ラトガース大学建築・プログラミング言語ラボの正しく丸められたLibm」. people.cs.rutgers.edu .
- ^ Cordes, Peter. 「intel - Clang の '_mm256_pow_ps' 組み込み関数はどこにありますか?」. Stack Overflow .
外部リンク
- : 数学的宣言 – The Open Groupの「基本定義リファレンス」、 The Single UNIX 仕様、バージョン 5
- 数学関数のCリファレンス