C 複雜數學支援
Microsoft C 執行時間連結庫 (CRT) 提供複雜的數學連結庫函式,包括 ISO C99 所需的所有函式。 編譯程式不會直接支援 complex
或 _Complex
關鍵詞,因此Microsoft實作會使用結構類型來表示複數。
實作這些函式可以平衡效能與正確性。 因為產生正確的四捨五入結果可能極為昂貴,所以這些函式會設計成有效率產生最接近正確四捨五入結果的近似值。 在大部分情況下,產生的結果是在正確四捨五入結果的 +/-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 而異。
在複雜數學中使用的類型
標頭的Microsoft實作 complex.h
會將這些類型定義為 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 |
計算複數的平方大小 |
作業函數
由於複數不是Microsoft編譯程式中的原生型別,因此不會在複雜型別上定義標準算術運算符。 為了方便起見,會提供這些複雜數學程式庫函數以在使用者程式碼中進行有限的複數操作:
函式 | 描述 |
---|---|
_Cmulcc 、 、 _FCmulcc _LCmulcc |
將兩個複數相乘 |
_Cmulcr 、 、 _FCmulcr _LCmulcr |
將複數與浮點數相乘 |