¿Cómo puedo trabajar con números complejos en C? Veo que hay un complex.h
archivo de encabezado, pero no me da mucha información sobre cómo usarlo. ¿Cómo acceder a partes reales e imaginarias de manera eficiente? ¿Hay funciones nativas para obtener el módulo y la fase?
c
complex-numbers
Charles Brunet
fuente
fuente
Respuestas:
Este código te ayudará, y es bastante claro:
con:
creal(z1)
: obtener la parte real (para flotantecrealf(z1)
, para doble largocreall(z1)
)cimag(z1)
: obtener la parte imaginaria (para flotantecimagf(z1)
, para doble largocimagl(z1)
)Otro punto importante a recordar cuando se trabaja con números complejos es que funciona como
cos()
,exp()
ysqrt()
debe ser reemplazado con sus formas complejas, por ejemploccos()
,cexp()
,csqrt()
.fuente
double complex
? ¿Es esta una extensión de lenguaje o alguna macro magia?complex
es un tipo c99 estándar (debajo del capó en GCC, en realidad es un alias para el tipo _Complex).complex
no es un tipo. Es una macro que se expande a_Complex
, que es un especificador de tipo , pero no un tipo en sí mismo. Los tipos son complejasfloat _Complex
,double _Complex
ylong double _Complex
.Los tipos complejos están en lenguaje C desde el estándar C99 (
-std=c99
opción de GCC). Algunos compiladores pueden implementar tipos complejos incluso en modos más anteriores, pero esta es una extensión no estándar y no portátil (por ejemplo, IBM XL, GCC, puede ser Intel, ...).Puede comenzar desde http://en.wikipedia.org/wiki/Complex.h : proporciona una descripción de las funciones de complex.h
Este manual http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html también brinda información sobre macros.
Para declarar una variable compleja, use
o
Para dar un valor en complejo, use
_Complex_I
macro decomplex.h
:(en realidad puede haber algunos problemas aquí con
(0,-0i)
números y NaN en la mitad del complejo)Módulo es
cabs(a)
/cabsl(c)
/cabsf(b)
; La parte real escreal(a)
, Imaginary iscimag(a)
.carg(a)
es para argumentos complejos.Para acceder directamente (leer / escribir) una parte real e imag puede usar esta extensión GCC no portable :
fuente
(complex float) { r, i }
también se puede usar para establecer las partes separadas del número e independientemente (permitiendo que la parte real sea INF mientras que la parte imaginaria es NAN, por ejemplo). Eso evita la palabra clave específica de GCC, aunque no estoy seguro de si en realidad es portátil.__STDC_NO_COMPLEX__
. En la práctica, sin embargo, se implementa en los principales compiladores.complex
se definirá como macro, expandido a_Complex
. Puede ser también interesado en Derek M. Jones "La nueva C estándar: Comentario Una Económica y Cultural" (2008) página 500 "tipos complejos" people.ece.cornell.edu/land/courses/ece4760/...Complex.h
fuente
Por conveniencia, se puede incluir una
tgmath.h
biblioteca para el tipo generar macros. Crea el mismo nombre de función que la versión doble para todo tipo de variable. Por ejemplo, Por ejemplo, se define unasqrt()
macro que se expande a lasqrtf()
,sqrt()
osqrtl()
función, dependiendo del tipo de argumento proporcionado.¡Entonces no es necesario recordar el nombre de la función correspondiente para diferentes tipos de variables!
fuente
La noción de números complejos se introdujo en las matemáticas, a partir de la necesidad de calcular raíces cuadráticas negativas. El concepto de número complejo fue tomado por una variedad de campos de ingeniería.
Hoy en día, los números complejos se utilizan ampliamente en dominios de ingeniería avanzados como la física, la electrónica, la mecánica, la astronomía, etc.
Parte real e imaginaria, de un ejemplo de raíz cuadrada negativa:
fuente
Para extraer la parte real de una expresión de valor complejo
z
, use la notación como__real__ z
. Del mismo modo, use el__imag__
atributo enz
para extraer la parte imaginaria.Por ejemplo;
r es la parte real del número complejo "z" i es la parte imaginaria del número complejo "z"
fuente