C の複雑な数値演算のサポート

Microsoft C ランタイム ライブラリ (CRT) には、ISO C99 で必要なすべての関数を含む複雑な数学ライブラリ関数が用意されています。 コンパイラでは complex または _Complex のキーワードが直接にはサポートされないため、Microsoft の実装では構造体型を使って複素数を表します。

これらの関数は、正確性とパフォーマンスのバランスをとるために実装されます。 正確に丸めた結果を生成するには非常にコストがかかる場合があるため、正確に丸めた結果の近似値を効率的に生成できるように当該関数が設計されました。 ほとんどの場合、生成される結果は、正しく丸められた結果の最小精度 (ULP) の +/-1 単位以内ですが、不正確さが大きい場合があります。

複雑な数値演算ルーチンはその実装において、浮動小数点数値演算ライブラリ関数に依存します。 この関数は、CPU アーキテクチャの種類に応じて実装の種類も異なります。 たとえば、32 ビット x86 CRT の実装は、64 ビット x64 CRT の実装とは異なります。 さらに、関数の中には特定の CPU アーキテクチャに対して複数の実装が用意されているものもあります。 CPU でサポートされている命令セットに応じて実行時に動的に実装を選択するのが最も効率的な方法です。 たとえば、32 ビット x86 CRT で、一部の関数には x87 実装と SSE2 実装の両方が用意されています。 SSE2 をサポートしている CPU で実行すると、速い方の SSE2 実装が使用されます。 SSE2 をサポートしていない CPU で実行すると、遅い方の x87 実装が使用されます。 数値演算ライブラリ関数の実装の種類が異なると、結果を生成するために使用する CPU 命令およびアルゴリズムも異なる場合があります。このため、CPU 間で、関数の生成する結果が異なる場合があります。 ほとんどの場合、結果は正しく丸められた結果の +/-1 ULP 内にありますが、実際の結果は CPU によって異なる場合があります。

複雑な数値演算で使用される型

complex.h ヘッダーの Microsoft 実装では、次の型が C99 標準ネイティブの複合型と同等として定義されます。

標準の型 Microsoft の型
float complex または float _Complex _Fcomplex
double complex または double _Complex _Dcomplex
long double complex または long double _Complex _Lcomplex

math.h ヘッダーでは、_cabs 関数に使用される個別の型 struct _complex を定義します。 struct _complex 型は同等の複雑な数値演算関数 cabscabsfcabsl では使用されません。

複雑な定数とマクロ

I{ 0.0f, 1.0f } で初期化された複合型の _Fcomplex として定義されます。

三角関数

機能 説明
cacos, cacosf, cacosl 複素数の複雑な逆余弦を計算する
casin, casinf, casinl 複素数の複雑な逆正弦を計算する
catan, catanf, catanl 複素数の複雑な逆正接を計算する
ccos, ccosf, ccosl 複素数の複雑な余弦を計算する
csin, csinf, csinl 複素数の複雑な正弦を計算する
ctan, ctanf, ctanl 複素数の複雑な正接を計算する

双曲線関数

機能 説明
cacosh, cacoshf, cacoshl 複素数の複雑な逆双曲線余弦を計算する
casinh, casinhf, casinhl 複素数の複雑な逆双曲線正弦を計算する
catanh, catanhf, catanhl 複素数の複雑な逆双曲線正接を計算する
ccosh, ccoshf, ccoshl 複素数の複雑な双曲線余弦を計算する
csinh, csinhf, csinhl 複素数の複雑な双曲線正弦を計算する
ctanh, ctanhf, ctanhl 複素数の複雑な双曲線正接を計算する

指数関数と対数関数

機能 説明
cexp, cexpf, cexpl 複素数の e を底とする複素指数関数を計算する
clog, clogf, clogl 複素数の e を底とする複素自然対数を計算する
clog10, clog10f, clog10l 複素数の 10 を底とする複素対数函数を計算する

べき関数と絶対値関数

機能 説明
cabs, cabsf, cabsl 複素数の絶対値 (ノルム、係数、大きさとも呼ばれる) を計算する
cpow, cpowf, cpowl 複雑な電力関数を計算する
csqrt, csqrtf, csqrtl 複素数の複雑な平方根を計算する

操作関数

機能 説明
_Cbuild, _FCbuild, _LCbuild 実数部と虚数部から複素数を構築する
carg, cargf, cargl 複素数の引数 (位相角とも呼ばれる) を計算する
cimag, cimagf, cimagl 複素数の虚数部を計算する
conj, conjf, conjl 複素数の複素共役を計算する
cproj, cprojf, cprojl リーマン球面上への複素数の射影を計算する
creal, crealf, creall 複素数の実数部を計算する
norm, normf, norml 複素数の 2 乗の絶対値を計算する

操作関数

複素数は Microsoft コンパイラでネイティブな型ではないため、標準の算術演算子は複合型に定義されていません。 便宜上、次の複雑な数値演算ライブラリ関数は、ユーザー コードでの複素数の限られた操作を有効にするために提供されています。

機能 説明
_Cmulcc, _FCmulcc, _LCmulcc 2 つの複素数を乗算する
_Cmulcr, _FCmulcr, _LCmulcr 複雑な浮動小数を乗算する

関連項目

ジェネリック型数値演算
カテゴリ別ユニバーサル C ランタイム ルーチン