C 参考手册

位置:首页 > C 参考手册 >数值 > 复数算术

若实现定义了宏常量 __STDC_NO_COMPLEX__ ,则不提供头文件 <complex.h> 、复数类型以及此处列出的所有名称。

(C11 起)

C 编程语言从 C99 开始支持三种内建类型 double _Complexfloat _Complexlong double _Complex 的复数数学运算(见 _Complex )。包含头文件 <complex.h> 时,三种复数类型亦可通过 double complexfloat complexlong double complex 使用。

除了复数类型,还支持三种虚数类型得到支持: double _Imaginaryfloat _Imaginarylong double _Imaginary (见 _Imaginary )。包含头文件 <complex.h> 时,三种虚数类型亦可通过 double imaginaryfloat imaginarylong double imaginary 使用。

标准算术运算符 +, -, *, / 可用于实数、复数及虚数类型的任意混合。

推荐编译器定义 __STDC_IEC_559_COMPLEX__ ,但并不强制要求其支持虚数。 POSIX 推荐检查是否定义宏 _Imaginary_I 以鉴别是否支持虚数。

(C99 起)
(C11 前)

若定义 __STDC_IEC_559_COMPLEX__ ,则支持虚数。

(C11 起)
定义于头文件 <complex.h>
类型
虚数类型宏
(关键字宏)
复数类型宏
(关键字宏)
虚数常量
虚数单位常量 i
(宏常量)
复数单位常量i
(宏常量)
(C99)
复数或虚数单位常量i
(宏常量)
操作
(C11)(C11)(C11)
由实部和虚部构建复数
(宏函数)
(C99)(C99)(C99)
计算复数的实部
(函数)
(C99)(C99)(C99)
计算复数的虚部
(函数)
(C99)(C99)(C99)
计算复数的模(绝对值)
(函数)
(C99)(C99)(C99)
计算复数的辐角
(函数)
(C99)(C99)(C99)
计算共轭复数
(函数)
(C99)(C99)(C99)
计算黎曼球上的投影
(函数)
指数函数
(C99)(C99)(C99)
计算复数的e底指数
(函数)
(C99)(C99)(C99)
计算复数的自然对数
(函数)
幂函数
(C99)(C99)(C99)
计算复数幂函数
(函数)
(C99)(C99)(C99)
计算复数平方根
(函数)
三角函数
(C99)(C99)(C99)
计算复数正弦
(函数)
(C99)(C99)(C99)
计算复数余弦
(函数)
(C99)(C99)(C99)
计算复数正切
(函数)
(C99)(C99)(C99)
计算复数反正弦
(函数)
(C99)(C99)(C99)
计算复数反余弦
(函数)
(C99)(C99)(C99)
计算复数反正切
(函数)
双曲函数
(C99)(C99)(C99)
计算复数双曲正弦
(函数)
(C99)(C99)(C99)
计算复双曲余弦
(函数)
(C99)(C99)(C99)
计算复数双曲正切
(函数)
(C99)(C99)(C99)
计算复数反双曲正弦
(函数)
(C99)(C99)(C99)
计算复数反双曲余弦
(函数)
(C99)(C99)(C99)
计算复数反双曲正切
(函数)

注意

下列函数名为 <complex.h> 的未来扩充而保留,并且在包含该头文件的程序中不可使用: cerfcerfccexp2cexpm1clog10clog1pclog2clgammactgamma ,还有它们带 -f 及 -l 后缀的变体。

尽管 C 标准以“复弧双曲正弦( complex arc hyperbolic sine )”等名称指名反双曲函数,双曲函数的反函数却是面积函数。它们的参数是双曲扇形的面积,而非弧长。正确名称是“复反双曲正弦”等等。一些作者会使用“复面积双曲正弦( complex area hyperbolic sine )”等名称。

若组分的一部分是无穷大,则复数或虚数为无穷大,即使另一组分是 NaN 。

若双组分都不是无穷大或 NaN ,则复数或虚数是有限的。

若双组分皆为正零或负零,则复数或虚数为零。

某些平台不支持虚数类型,变通方式是使用复数和其实浮点转换类型进行运算。且以下使用的函数如果是 <tgmath.h> 的,会与 <math.h> 产生命名冲突,导致操作系统出现资源占满的死循环现象,建议直接使用来自 <complex.h> 的函数。

示例

#include <stdio.h>
#include <complex.h>
#include <tgmath.h>
 
int main(void)
{
    double complex z1 = I * I;     // 虚数单位平方
    printf("I * I = %.1f%+.1fi\n", creal(z1), cimag(z1));
 
    double complex z2 = pow(I, 2); // 虚数单位平方
    printf("pow(I, 2) = %.1f%+.1fi\n", creal(z2), cimag(z2));
 
    double PI = acos(-1);
    double complex z3 = exp(I * PI); // 欧拉公式
    printf("exp(I*PI) = %.1f%+.1fi\n", creal(z3), cimag(z3));
 
    double complex z4 = 1+2*I, z5 = 1-2*I; // 共轭
    printf("(1+2i)*(1-2i) = %.1f%+.1fi\n", creal(z4*z5), cimag(z4*z5));
}

输出:

I * I = -1.0+0.0i
pow(I, 2) = -1.0+0.0i
exp(I*PI) = -1.0+0.0i
(1+2i)*(1-2i) = 5.0+0.0i

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 6.10.8.3/1/2 __STDC_NO_COMPLEX__ (p: 177)
  • 6.10.8.3/1/2 __STDC_IEC_559_COMPLEX__ (p: 177)
  • 7.3 Complex arithmetic <complex.h> (p: 188-199)
  • 7.3.1/2 __STDC_NO_COMPLEX__ (p: 188)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • 7.31.1 Complex arithmetic <complex.h> (p: 455)
  • B.2 Complex <complex.h> (p: 475-477)
  • Annex G (normative) IEC 60559-compatible complex arithmetic (p: 532-545)
  • G.1/1 __STDC_IEC_559_COMPLEX__ (p: 532)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.10.8/2 __STDC_IEC_559_COMPLEX__ (p: 161)
  • 7.3 Complex arithmetic <complex.h> (p: 170-180)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • 7.26.1 Complex arithmetic <complex.h> (p: 401)
  • B.2 Complex <complex.h> (p: 419-420)
  • Annex G (informative) IEC 60559-compatible complex arithmetic (p: 467-480)
  • G.1/1 __STDC_IEC_559_COMPLEX__ (p: 467)

参阅