C言語の数学関数

C言語の数学演算は、 Cプログラミング言語標準ライブラリに含まれる 、基本的な数学関数を実装した関数群です。 [1] [2]異なるC標準では、下位互換性はあるものの、異なる関数セットが提供されています。これらの関数のほとんどは、 C++標準ライブラリでも利用可能ですが、ヘッダーは異なります(Cヘッダーも含まれていますが、非推奨の互換性機能としてのみ使用されています)。

関数の概要

浮動小数点数を使用する数学関数のほとんどは、 <math.h>( C++のヘッダー)で定義されています。 、、、などの整数<cmath>を操作する関数は、代わりにヘッダー( C++のヘッダー)で定義されていますabslabsdivldiv<stdlib.h><cstdlib>

角度を操作する関数は、角度の単位としてラジアンを使用します[ 1 ]

これらの関数のすべてがC89標準で利用できるわけではありません。利用できる関数でも、double浮動小数点引数として型のみを受け入れるため、単精度値を使用するコードではコストのかかる型変換が必要になります。C99では、この欠点は、引数と引数floatで動作する新しい関数セットを導入することで修正されました。これらの関数は、それぞれ接尾辞とで識別されます[ 3]floatlong doublefl

関数説明
abs
labs
llabs
整数値の絶対値を計算します
fabs浮動小数点値の絶対値を計算します
div
ldiv
lldiv
整数除算の商と余りを計算します
fmod浮動小数点除算の余り
remainder除算の符号付き余り
remquo除算の符号付き余りと最後の3ビット
fma積和演算
fmax2つの浮動小数点値のうち大きい方
fmin2つの浮動小数点値のうち小さい方
fdim2つの浮動小数点値の正の差
nan
nanf
nanl
NaN(非数)を返します

指数関数
expeの指定された累乗を返します
exp22
expm1eの指定された累乗から1を引いた値を返します
log自然対数(底e)を計算します
log22の2乗対数を計算します
log10常用対数(底10)を計算します
log1p1に指定された数値を加えた自然対数(底e)を計算します
ilogb数値の指数を抽出します
logb数値の指数を抽出します
べき乗
関数
sqrt平方根を計算します
cbrt3乗根を計算します
hypot2つの指定された数値の平方の和の平方根計算します
pow数値を指定された指数でべき乗します[4]

三角
sin正弦計算ます
cos余弦を計算します
tan正接を計算します
asin逆正弦を計算します
acos逆余弦を計算します
atan逆正接を計算します
atan2象限を決定するために符号を使用して逆正接を計算します
双曲線関数
sinh双曲線正弦を計算します
cosh双曲線余弦を計算します
tanh双曲線正接を計算します
asinh双曲線逆正弦を計算します
acosh双曲線逆余弦を計算します
atanh双曲線逆正接を計算します
誤差関数と
ガンマ
関数
erf誤差関数を計算します
erfc相補誤差関数を計算します
lgammaガンマ関数の絶対値の自然対数を計算します
tgammaガンマ関数を計算します
最も近い
整数
浮動
小数点
演算
ceil指定された値以上の最も近い整数を返します
floor指定された値より大きくない最も近い整数を返します
trunc指定された値より絶対値が小さい最も近い整数を返します
round
lround
llround
中間の場合はゼロから遠い方向に丸め、最も近い整数を返します
nearbyint現在の丸めモードを使用して最も近い整数を返します
rint
lrint
llrint
結果が異なる場合を除き、現在の丸めモードを使用して最も近い整数を返します
浮動
小数点
操作
関数
frexp数値を仮数部と2の累乗に分解します
ldexp数値に2の累乗を掛けます
modf数値を整数部と小数部に分解します
scalbn
scalbln
数値にFLT_RADIXの累乗を掛けます
nextafter
nexttoward
指定された値に向かって、次に表現可能な浮動小数点値を返します
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つの異なる関数(floatdoubleおよびlong double関数のバリアント)をカプセル化します。

C++言語は関数オーバーロードのネイティブサポートを含んでいるため、<tgmath.h>互換性機能としてもヘッダーを提供していません。

乱数生成

ヘッダー<stdlib.h><cstdlib>C++では)は、統計的乱数生成に使用できるいくつかの関数を定義します。[6]

関数説明
rand0から(両端を含む)までの疑似乱数を生成しますRAND_MAX
srand疑似乱数生成器を初期化します。
arc4randomUINT32_MAX通常は、よりも優れたアルゴリズムを使用して、0から までの疑似乱数を生成します。rand
arc4random_uniform0から最大値までの疑似乱数を生成します。
arc4random_bufバッファを疑似乱数ビットストリームで埋めます。
arc4random_stir疑似乱数生成器を初期化します

arc4random乱数関数のファミリーはPOSIX標準では定義されていませんが、いくつかの一般的な実装に見られます。これは、漏洩したRC4暗号(したがって「a lleged RC4libc 」)のキーストリームジェネレータを指していましたが、それ以降、通常はChaCha20などの他の暗号からの異なるアルゴリズムが同じ名前を使用して実装されています。

の乱数の品質はrand通常、統計的にランダムであると見なすには弱すぎるため、明示的なシードが必要です。可能な場合は通常、arc4random代わりにを使用することをお勧めしますrand。一部のCライブラリは、内部的にrandを使用して実装していますarc4random_uniform

実装

LinuxBSDなどのPOSIXシステムでは、数学関数(で宣言されている)は数学ライブラリに別途バンドルされています。したがって、これらの関数のいずれかを使用する場合は、リンカーにディレクティブを指定する必要があります。実装にはさまざまなものがあり、以下が含まれます 。<math.h>libm-lmlibm

必ずしもという名前ではない実装には、以下libmが含まれます。

  • Armの最適化された数学ルーチン
  • GCE-Mathは、C++用に記述されたC/C++数学関数のバージョンですconstexpr(コンパイル時計算)
  • CORE-MATH、単精度と倍精度で正しく丸められています
  • SIMD(ベクトル化)数学ライブラリには、SLEEF、Yeppp! Archived 2020-07-14 at the Wayback MachineAgner FogのVCLに加え、SVMLやDirectXMathなどのクローズドソースのライブラリもいくつかあります。[9]

参照

参考文献

  1. ^ ab ISO/IEC 9899:1999仕様(PDF) 212ページ、§7.12
  2. ^ Prata, Stephen (2004). C primer plus . Sams Publishing. 付録B、セクションV:C99追加機能を備えた標準ANSI Cライブラリ。ISBN   0-672-32696-5
  3. ^ ab Prata, Stephen (2004). C primer plus . Sams Publishing. 付録B、セクションVIII:C99数値計算拡張機能。ISBN  0-672-32696-5
  4. ^記法上、平方または立方を計算するのにpow( x ,2)またはpow( x ,3)を使用するのが便利に思えるかもしれません。しかし、時間的にクリティカルなコードでは、これは推奨されません。コンパイル時にこれらのケースに特別な配慮をしない限り、x * xまたはx * x * xの方がはるかに高速に実行されます。また、sqrt( x )とcbrt( x )は、pow( x ,.5)またはpow( x ,1./3)よりも優先されるべきです
  5. ^ man cerf(3), man cerfc(3)、例えばhttps://linux.die.net/man/3/cerfを参照してください。
  6. ^ "GNU Cライブラリ - ISOランダム" 。 2018年7月18日閲覧
  7. ^ "数学関数 - LLVM Cライブラリ". libc.llvm.org .
  8. ^ "RLibm: ラトガース大学アーキテクチャ・プログラミング言語ラボの正しく丸められたLibm". people.cs.rutgers.edu .
  9. ^ Cordes, Peter. "intel - Clangの'_mm256_pow_ps'組み込み関数はどこにありますか?"。Stack Overflow .
「https://en.wikipedia.org/w/index.php?title=C_mathematical_functions&oldid=1302403948」より取得