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 | 3乗根を計算します | |
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>ヘッダー(C++<cfenv> )で定義されています。
| 関数 | 説明 |
|---|---|
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便利なマクロ。ヘッダーがインクルードされている場合にのみ使用可能<complex.h>)が追加されています。任意の浮動小数点型は で変更できcomplex、浮動小数点数のペアとして定義されます。C99 と C++ は複素数をコード互換性のある方法で実装していないことに注意してください。
後者は代わりにクラス を提供しますstd::complex
複素数に対するすべての演算は<complex.h>ヘッダーで定義されています。実数値関数と同様に、fまたはl接尾辞は関数のfloat complexまたは型を表します。long 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での将来の使用のために予約されています」。[ 5 ]実装は、標準ライブラリの一部ではないオープンソースプロジェクトによって提供されています。 |
さらにいくつかの複雑な関数は、「C99での将来の使用のために予約されています」。[5]実装は、標準ライブラリの一部ではないオープンソースプロジェクトによって提供されています。
| 関数 | 説明 | |
|---|---|---|
| 複素誤差関数を計算します( C99 ) | cerf | 複素相補誤差関数を計算します( C99 ) |
cerfc | 型汎用関数 |
[編集]
ヘッダーは、および<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 | UINT32_MAX通常は、よりも優れたアルゴリズムを使用して、0から までの疑似乱数を生成します。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でほぼそのまま使用
- Intel 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) 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の方がはるかに高速に実行されます。また、sqrt( x )とcbrt( x )は、pow( x ,.5)またはpow( x ,1./3)よりも優先されるべきです
- ^ man cerf(3), man cerfc(3)、例えばhttps://linux.die.net/man/3/cerfを参照してください。
- ^ "GNU Cライブラリ - ISOランダム" 。 2018年7月18日閲覧。
- ^ "数学関数 - LLVM Cライブラリ". libc.llvm.org .
- ^ "RLibm: ラトガース大学アーキテクチャ・プログラミング言語ラボの正しく丸められたLibm". people.cs.rutgers.edu .
- ^ Cordes, Peter. "intel - Clangの'_mm256_pow_ps'組み込み関数はどこにありますか?"。Stack Overflow .
外部リンク
- :数学的宣言 - 基本定義リファレンス、The Single UNIX仕様、バージョン5、The Open Group
- 数学関数のCリファレンス