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
型は同等の複雑な数値演算関数 cabs
、cabsf
、cabsl
では使用されません。
複雑な定数とマクロ
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 |
複雑な浮動小数を乗算する |