C 复数数学支持
Microsoft C 运行时库 (CRT) 提供了复数数学库函数,包括 ISO C99 需要的所有函数。 编译器不直接支持 complex
或 _Complex
关键字,因此 Microsoft 实现使用结果类型表示复数。
这些函数的实现是为了平衡性能与正确性。 因为产生正确舍入的结果可能成本过高,这些函数旨在有效地生成接近正确舍入结果的近似结果。 在大多数情况下,虽然可能存在误差较大的情况,但生成的结果在正确舍入结果的 +/-1 最小精度单位 (ULP) 范围内。
复数数学例程依赖于浮点数学库函数进行实现。 这些函数具有不同 CPU 体系结构的不同实现。 例如,相比 64 位 x64 CRT,32 位 x86 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
标头定义单独的 struct _complex
类型,该类型用于 _cabs
函数。 等效的复数数学函数 cabs
、cabsf
、cabsl
不使用 struct _complex
类型。
复数常数和宏
将 I
定义为由 { 0.0f, 1.0f }
初始化的复数类型 _Fcomplex
。
三角函数
Function | 说明 |
---|---|
.- . | 计算复数的复数反余弦值 |
.- . | 计算复数的复数反正弦值 |
.- . | 计算复数的复数反正切值 |
.- . | 计算复数的复数余弦值 |
.- . | 计算复数的复数正弦值 |
.- . | 计算复数的复数正切值 |
双曲函数
Function | 说明 |
---|---|
.- . | 计算复数的复数反双曲余弦值 |
.- . | 计算复数的复数反双曲正弦值 |
.- . | 计算复数的复数反双曲正切值 |
.- . | 计算复数的复数双曲余弦值 |
.- . | 计算复数的复数双曲正弦值 |
.- . | 计算复数的复数双曲正切值 |
指数和对数函数
函数 | 说明 |
---|---|
.- . | 计算复数的以 e 为底的复数指数 |
.- . | 计算复数的(以 e 为底的)复数自然对数 |
.- . | 计算复数的以 10 为底的复数对数 |
幂和绝对值函数
函数 | 说明 |
---|---|
.- . | 计算复数的复数绝对值(也称为范数、模数或量值) |
.- . | 计算复数幂函数 |
.- . | 计算复数的复数平方根 |
操作函数
Function | 说明 |
---|---|
.- . | 从实部和虚部构造复数 |
.- . | 计算复数的自变量(也称为相角) |
.- . | 检索复数的虚部 |
.- . | 计算复数的复数共轭 |
.- . | 计算 Riemann 球体上某个复数的投影 |
.- . | 计算复数的实部 |
.- . | 计算复数的平方量值 |
运算函数
由于复数不是 Microsoft 编译器中的本机类型,复数类型上未定义标准的算术运算符。 为方便起见,这些复数数学库函数用于实现用户代码中的复数的有限处理:
函数 | 说明 |
---|---|
.- . | 将两个复数相乘 |
.- . | 将复数和浮点数相乘 |