Как я могу работать с комплексными числами на C? Я вижу, что есть complex.h
файл заголовка, но он не дает мне много информации о том, как его использовать. Как эффективно получить доступ к реальным и мнимым частям? Есть ли собственные функции для получения модуля и фазы?
c
complex-numbers
Шарль Брюне
источник
источник
Ответы:
Этот код поможет вам, и он не требует пояснений:
с участием:
creal(z1)
: получить реальную часть (для floatcrealf(z1)
, для long doublecreall(z1)
)cimag(z1)
: получить мнимую часть (для floatcimagf(z1)
, для long doublecimagl(z1)
)Еще один важный момент , чтобы помнить при работе с комплексными числами , является то , что такие функции , как
cos()
,exp()
иsqrt()
должны быть заменены их сложными формами, напримерccos()
,cexp()
,csqrt()
.источник
double complex
? Это расширение языка или магия макросов?complex
- это стандартный тип c99 (в GCC это фактически псевдоним типа _Complex).complex
это не тип. Это макрос, который расширяется до спецификатора_Complex
типа , но не сам по себе. Сложные типы , и .float _Complex
double _Complex
long double _Complex
Сложные типы находятся в языке 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 также дает некоторую информацию о макросах.
Чтобы объявить сложную переменную, используйте
или
Чтобы преобразовать значение в комплекс, используйте
_Complex_I
макрос изcomplex.h
:(на самом деле здесь могут быть проблемы с
(0,-0i)
числами и NaN в одной половине комплекса)Модуль есть
cabs(a)
/cabsl(c)
/cabsf(b)
; Реальная часть - этоcreal(a)
мнимая частьcimag(a)
.carg(a)
для сложного аргумента.Для прямого доступа (чтения / записи) к реальной части изображения вы можете использовать это непереносимое расширение GCC :
источник
(complex float) { r, i }
также можно использовать для установки отдельных частей числа и независимо (например, позволяя действительной части быть INF, а мнимой - NAN). Это позволяет избежать ключевого слова, специфичного для GCC, хотя я не уверен, действительно ли оно переносимо.__STDC_NO_COMPLEX__
. Однако на практике это реализовано на основных компиляторах.complex
будет определен как макрос, расширенный до_Complex
. Возможно, вас заинтересует книга Дерека М. Джонса «Новый стандарт Си: экономический и культурный комментарий» (2008), стр. 500 «сложные типы» people.ece.cornell.edu/land/courses/ece4760/…Complex.h
источник
Для удобства можно включить
tgmath.h
библиотеку для типа создания макросов. Он создает то же имя функции, что и двойная версия для всех типов переменных. Например, Например, он определяетsqrt()
макрос , который расширяется кsqrtf()
,sqrt()
илиsqrtl()
функции, в зависимости от типа аргумента при условии.Так что не нужно запоминать соответствующее имя функции для разных типов переменных!
источник
Понятие комплексных чисел было введено в математику из-за необходимости вычисления отрицательных квадратных корней. Концепция комплексных чисел была взята на вооружение в самых разных областях техники.
Сегодня эти комплексные числа широко используются в передовых инженерных областях, таких как физика, электроника, механика, астрономия и т. Д.
Пример действительной и мнимой части отрицательного квадратного корня:
источник
Чтобы извлечь действительную часть выражения с комплексным знаком
z
, используйте обозначение as__real__ z
. Точно так же используйте__imag__
атрибутz
для извлечения мнимой части.Например;
r - действительная часть комплексного числа "z"; i - мнимая часть комплексного числа "z".
источник