Como posso trabalhar com números complexos em C? Vejo que há um complex.h
arquivo de cabeçalho, mas ele não fornece muita informação sobre como usá-lo. Como acessar partes reais e imaginárias de maneira eficiente? Existem funções nativas para obter módulo e fase?
c
complex-numbers
Charles Brunet
fonte
fonte
Respostas:
Este código irá ajudá-lo e é bastante auto-explicativo:
com:
creal(z1)
: obtém a parte real (para floatcrealf(z1)
, long longcreall(z1)
)cimag(z1)
: obtém a parte imaginária (para floatcimagf(z1)
, long longcimagl(z1)
)Outro ponto importante a lembrar quando se trabalha com números complexos é que as funções gosto
cos()
,exp()
esqrt()
deve ser substituído por suas formas complexas, por exemploccos()
,cexp()
,csqrt()
.fonte
double complex
? Isso é uma extensão de idioma ou alguma macro mágica?complex
é um tipo c99 padrão (sob o capô do GCC, na verdade é um alias para o tipo _Complex).complex
não é um tipo. É uma macro que se expande para_Complex
, que é um especificador de tipo , mas não um tipo por si só. Os tipos complexos sãofloat _Complex
,double _Complex
elong double _Complex
.Tipos complexos estão no idioma C desde o padrão C99 (
-std=c99
opção do GCC). Alguns compiladores podem implementar tipos complexos, mesmo em modos mais antigos, mas essa é uma extensão não padrão e não portátil (por exemplo, IBM XL, GCC, pode ser intel, ...).Você pode começar em http://en.wikipedia.org/wiki/Complex.h - fornece uma descrição das funções em complex.h
Este manual http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html também fornece algumas informações sobre macros.
Para declarar uma variável complexa, use
ou
Para atribuir um valor ao complexo, use a
_Complex_I
macro decomplex.h
:(na verdade, pode haver alguns problemas aqui com
(0,-0i)
números e NaNs na metade única do complexo)O módulo é
cabs(a)
/cabsl(c)
/cabsf(b)
; Parte real écreal(a)
, imaginário écimag(a)
.carg(a)
é para argumento complexo.Para acessar diretamente (ler / escrever) uma parte imag real, você pode usar esta extensão GCC não portável :
fonte
(complex float) { r, i }
também pode ser usada para definir as partes separadas do número e de forma independente (permitindo que a parte real seja INF enquanto a parte imaginária é NAN, por exemplo). Isso evita a palavra-chave específica do GCC, embora não tenha certeza se ela é realmente portátil.__STDC_NO_COMPLEX__
. Na prática, no entanto, é implementado nos principais compiladores.complex
será definido como macro, expandido para_Complex
. Você pode também estar interessado em "O Novo Padrão C: Um Comentário Econômico e Cultural", de Derek M. Jones (2008), página 500 "tipos complexos" people.ece.cornell.edu/land/courses/ece4760/…Complex.h
fonte
Por conveniência, pode-se incluir uma
tgmath.h
biblioteca para o tipo gerar macros. Ele cria o mesmo nome da função que a versão dupla para todo tipo de variável. Por exemplo, Por exemplo, ele define umsqrt()
macro que se expande para osqrtf()
,sqrt()
ousqrtl()
função, dependendo do tipo de argumento fornecida.Portanto, não é necessário lembrar o nome da função correspondente para diferentes tipos de variáveis!
fonte
A noção de números complexos foi introduzida na matemática, a partir da necessidade de calcular raízes quadráticas negativas. O conceito de número complexo foi adotado por uma variedade de campos de engenharia.
Hoje, esses números complexos são amplamente utilizados em domínios de engenharia avançada, como física, eletrônica, mecânica, astronomia, etc.
Parte real e imaginária, de um exemplo de raiz quadrada negativa:
fonte
Para extrair a parte real de uma expressão com valor complexo
z
, use a notação como__real__ z
. Da mesma forma, use o__imag__
atributo noz
para extrair a parte imaginária.Por exemplo;
r é a parte real do número complexo "z" i é a parte imaginária do número complexo "z"
fonte