16-复数和虚数类型
3.4.7 复数和虚数类型
许多科学和工程计算都要用到复数和虚数。C99标准支持复数类型和虚数类型,但是有所保留。一些独立实现,如嵌入式处理器的实现,就不需要使用复数和虚数(VCR芯片就不需要复数)。一般而言,虚数类型都是可选项。C11标准把整个复数软件包都作为可选项。
简而言之,C语言有 3
种复数类型: float _Complex
、 double _Complex
和 long double _Complex
。例如, float _Complex
类型的变量应包含两个 float
类型的值,分别表示复数的实部和虚部。类似地,C语言的 3
种虚数类型是 float _Imaginary
、 double _Imaginary
和 long double _Imaginary
。
如果包含 complex.h
头文件,便可用 complex
代替 _Complex
,用 imaginary
代替 _Imaginary
,还可以用 I
代替 -1
的平方根。
为何C标准不直接用 complex
作为关键字来代替 _Complex
,而要添加一个头文件(该头文件中把 complex
定义为 _Complex
)?因为标准委员会考虑到,如果使用新的关键字,会导致以该关键字作为标识符的现有代码全部失效。例如,之前的 C99
,许多程序员已经使用 struct complex
定义一个结构来表示复数或者心理学程序中的心理状况(关键字 struct
用于定义能存储多个值的结构,详见第 14
章)。让 complex
成为关键字会导致之前的这些代码出现语法错误。但是,使用 struct _Complex
的人很少,特别是标准使用首字母是下划线的标识符作为预留字以后。因此,标准委员会选定 _Complex
作为关键字,在不用考虑名称冲突的情况下可选择使用 complex
。