Как работать с комплексными числами в C?


Как я могу работать с комплексными числами в C? Я вижу, что есть complex.h заголовочный файл, но это не дает мне много информации о том, как использовать его. Как получить эффективный доступ к реальным и мнимым частям? Есть ли встроенные функции для получения модуля и фазы?

6 103

6 ответов:

этот код поможет вам, и это довольно очевидны:

#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): получить реальную часть (для float crealf(z1), в течение длительного двойной creall(z1))

cimag(z1): получить мнимую часть (для float cimagf(z1), в течение длительного двойной cimagl(z1))

еще один важный момент, чтобы помнить при работе с комплексными числами-функции как cos(),exp() и sqrt() необходимо заменить с их сложными формами, например ccos(),cexp(),csqrt().

сложные типы находятся на языке C, начиная со стандарта C99 (-std=c99 вариант GCC). Некоторые компиляторы могут реализовывать сложные типы даже в более ранних режимах, но это нестандартное и непортативное расширение (например, IBM XL, GCC, может быть intel,... ).

вы можете начать с http://en.wikipedia.org/wiki/Complex.h - дает описание функций из комплекса.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) для комплексного аргумента.

чтобы напрямую получить доступ (чтение/запись) к реальной части imag, вы можете использовать это не переноситсяGCC-extension:

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

понятие комплексных чисел было введено в математику, исходя из необходимости вычисления отрицательных квадратичных корней. Понятие комплексного числа было принято в различных областях техники.

действительная и мнимая часть, пример отрицательного квадратного корня:

#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 библиотека для типа создать макросы. Он создает то же имя функции, что и двойная версия для всех типов переменных. Например, например, он определяет sqrt() макрос, который расширяется до sqrtf(),sqrt() или

для извлечения действительной части комплекснозначного выражение z, нотация, как __real__ z. Аналогично, используйте на z для извлечения мнимой части.

например:

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

r-действительная часть комплексного числа " z" i-мнимая часть комплексного числа "z"