Как работать с комплексными числами в C?
Как я могу работать с комплексными числами в C? Я вижу, что есть complex.h
заголовочный файл, но он не дает мне много информации о том, как его использовать. Как получить доступ к реальным и мнимым частям эффективным способом? Есть ли встроенные функции для получения модуля и фазы?
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)
: получить реальную часть (для поплавка crealf(z1)
, долго двойной creall(z1)
)
cimag(z1)
: получить мнимую часть (для поплавка 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 - он дает описание функций из 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)
для сложного аргумента.
Для прямого доступа (чтения / записи) к реальной части imag вы можете использовать это непереносимое расширение GCC:
__real__ a = 1.4;
__imag__ a = 2.0;
float b = __real__ a;
Для удобства можно включить tgmath.h
библиотека для типа генерировать макросы. Он создает то же имя функции, что и двойная версия для всех типов переменных. Например, например, он определяет 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;
}
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;
}
Чтобы извлечь действительную часть комплексного выражения z
используйте обозначение как __real__ z
, Точно так же используйте __imag__
атрибут на z
извлечь мнимую часть.
Например;
__complex__ float z;
float r;
float i;
r = __real__ z;
i = __imag__ z;
r - действительная часть комплексного числа "z" i - мнимая часть комплексного числа "z"