如何处理C中的复数?
我如何处理C中的复数? 我看到有一个complex.h
头文件,但是并没有给我太多关于如何使用它的信息。 如何以有效的方式访问真实和虚拟的部分? 有原生function获取模块和阶段?
这段代码会帮助你,而且不言自明:
#include <stdio.h> /* Standard Library of Input and Output */ #include <complex.h> /* Standard Library of Complex Numbers */ int main() { double complex z1 = 1.0 + 3.0 * I; double complex z2 = 1.0 - 4.0 * I; printf("Working with complex numbers:\n\v"); printf("Starting values: Z1 = %.2f + %.2fi\tZ2 = %.2f %+.2fi\n", creal(z1), cimag(z1), creal(z2), cimag(z2)); double complex sum = z1 + z2; printf("The sum: Z1 + Z2 = %.2f %+.2fi\n", creal(sum), cimag(sum)); double complex difference = z1 - z2; printf("The difference: Z1 - Z2 = %.2f %+.2fi\n", creal(difference), cimag(difference)); double complex product = z1 * z2; printf("The product: Z1 x Z2 = %.2f %+.2fi\n", creal(product), cimag(product)); double complex quotient = z1 / z2; printf("The quotient: Z1 / Z2 = %.2f %+.2fi\n", creal(quotient), cimag(quotient)); double complex conjugate = conj(z1); printf("The conjugate of Z1 = %.2f %+.2fi\n", creal(conjugate), cimag(conjugate)); return 0; }
有:
creal(z1)
:得到真正的部分(用于crealf(z1)
,用于长双creall(z1)
)
cimag(z1)
:得到虚部(对于float cimagf(z1)
,对于long double cimagl(z1)
)
使用复数时要记住的另一个重点是像cos()
, exp()
和sqrt()
这样的函数必须用它们的复杂formsreplace,例如ccos()
, cexp()
, csqrt()
。
自C99标准以来,复杂types是C语言(GCC的-std=c99
选项)。 有些编译器甚至可以在更早的模式下实现复杂的types,但是这是非标准和非可移植的扩展(例如IBM XL,GCC,可能是intel,…)。
您可以从http://en.wikipedia.org/wiki/Complex.h开始; – 它提供了complex.h函数的描述
本手册http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html也提供了一些关于macros的信息。;
要声明一个复杂的variables,请使用
double _Complex a; // use c* functions without suffix
要么
float _Complex b; // use c*f functions - with f suffix long double _Complex c; // use c*l functions - with l suffix
为了赋予复杂的值,使用complex.h
_Complex_I
macros:
float _Complex d = 2.0f + 2.0f*_Complex_I;
(实际上在(0,-0i)
数和NaN在复数的一半中可能存在一些问题)
模块是cabs(a)
/ cabsl(c)
/ cabsf(b)
; 真正的部分是creal(a)
,想象是cimag(a)
。 carg(a)
是复杂的论点。
要直接访问(读/写)真实的图像部分,您可以使用这个不可移植的 GCC扩展 :
__real__ a = 1.4; __imag__ a = 2.0; float b = __real__ a;
Complex.h
#include <stdio.h> /* Standard Library of Input and Output */ #include <complex.h> /* Standart Library of Complex Numbers */ int main() { double complex z1 = 1.0 + 3.0 * I; double complex z2 = 1.0 - 4.0 * I; printf("Working with complex numbers:\n\v"); printf("Starting values: Z1 = %.2f + %.2fi\tZ2 = %.2f %+.2fi\n", creal(z1), cimag(z1), creal(z2), cimag(z2)); double complex sum = z1 + z2; printf("The sum: Z1 + Z2 = %.2f %+.2fi\n", creal(sum), cimag(sum)); }
复数的概念是从math中引入的,从计算负二次方根的需要出发。 复杂的数字概念被各种工程领域所采用。
今天,复杂的数字被广泛用于先进的工程领域,如物理学,电子学,力学,天文学等等。
负平方根例子的实部和虚部:
#include <stdio.h> #include <complex.h> int main() { int negNum; printf("Calculate negative square roots:\n" "Enter negative number:"); scanf("%d", &negNum); double complex negSqrt = csqrt(negNum); double pReal = creal(negSqrt); double pImag = cimag(negSqrt); printf("\nReal part %f, imaginary part %f" ", for negative square root.(%d)", pReal, pImag, negNum); return 0; }
为了方便起见,可以使用tgmath.h
库来生成types生成macros。 它为所有types的variables创build与双重版本相同的函数名称。 例如,它定义了一个扩展到sqrtf()
, sqrt()
或sqrtl()
函数的sqrt()
macros,具体取决于提供的参数的types。
所以不需要为不同types的variables记住相应的函数名称!
#include <stdio.h> #include <tgmath.h>//for the type generate marcros. #include <complex.h>//for easier declare complex variables and complex unit I int main(void) { double complex z1=1./4.*M_PI+1./4.*M_PI*I;//M_PI is just pi=3.1415... double complex z2, z3, z4, z5; z2=exp(z1); z3=sin(z1); z4=sqrt(z1); z5=log(z1); printf("exp(z1)=%lf + %lf I\n", creal(z2),cimag(z2)); printf("sin(z1)=%lf + %lf I\n", creal(z3),cimag(z3)); printf("sqrt(z1)=%lf + %lf I\n", creal(z4),cimag(z4)); printf("log(z1)=%lf + %lf I\n", creal(z5),cimag(z5)); return 0; }
要提取复数值expression式z
的实数部分,请使用符号__real__ z
。 同样,在z
上使用__imag__
属性来提取虚部。
例如;
__complex__ float z; float r; float i; r = __real__ z; i = __imag__ z;
r是复数“z”的实部,i是复数“z”的虚部,