如何使用C中的复数?

时间:2011-06-20 23:44:17

标签: c complex-numbers

如何使用C中的复数?我看到有一个complex.h头文件,但它没有给我很多关于如何使用它的信息。如何以有效的方式访问实部和虚部?是否存在获取模块和阶段的本机函数?

6 个答案:

答案 0 :(得分:171)

此代码对您有所帮助,而且相当不言自明:

#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()等函数必须替换为其复杂形式,例如ccos()cexp()csqrt()

答案 1 :(得分:39)

复杂类型是C语言,因为C99标准(GCC的-std=c99选项)。有些编译器甚至可以在更早的模式下实现复杂类型,但这是非标准和非可移植扩展(例如IBM XL,GCC,可能是英特尔......)。

你可以从http://en.wikipedia.org/wiki/Complex.h开始 - 它给出了来自complex.h的函数的描述

本手册http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html还提供了有关宏的一些信息。

要声明复杂变量,请使用

  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_I中的complex.h宏:

  float _Complex d = 2.0f + 2.0f*_Complex_I;

(实际上这里可能存在一些问题,(0,-0i)数字和NaNs在复数的一半中

模块为cabs(a) / cabsl(c) / cabsf(b);实部是creal(a),虚数是cimag(a)carg(a)用于复杂的论证。

要直接访问(读/写)真实的想象部分,您可以使用不可移植 GCC-extension

 __real__ a = 1.4;
 __imag__ a = 2.0;
 float b = __real__ a;

答案 2 :(得分:8)

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));
}

答案 3 :(得分:2)

从计算负二次根的需要出发,在数学中引入了复数的概念。复杂数字概念由各种工程领域采用。

今天复杂的数字被广泛应用于物理,电子,机械,天文等高级工程领域......

负平方根示例的实部和虚部:

#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;
}

答案 4 :(得分:1)

为方便起见,可以在类型生成宏中包含tgmath.h库。它为所有类型的变量创建与double版本相同的函数名称。例如,它定义了一个sqrt()宏,它扩展为sqrtf()sqrt()sqrtl()函数,具体取决于提供的参数类型。

因此,不需要记住不同类型变量的相应函数名称!

#include <stdio.h>
#include <tgmath.h>//for the type generate macros. 
#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;
}

答案 5 :(得分:-1)

要提取复值表达式z的实部,请使用符号__real__ z。 同样,在__imag__上使用z属性来提取虚部。

例如;

__complex__ float z;
float r;
float i;
r = __real__ z;
i = __imag__ z;

r是复数“z”的实部 我是复数“z”的想象部分