Как работать с комплексными числами в 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)
: получить реальную часть (для floatcrealf(z1)
, в течение длительного двойнойcreall(z1)
)
cimag(z1)
: получить мнимую часть (для floatcimagf(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"