COMPLEX
Section: C Library Functions (3V)
Updated: LOCAL
Index
Return to Main Contents
delim @@
NAME
complex - complex arithmetic operations
SYNOPSIS
#include <complex.h> /* assuming appropriate cc -I option */
/* All the following functions are declared in this header file. */
complex *CxAdd(ap,bp);
complex *ap, *bp;
complex *CxSub(ap,bp);
complex *ap, *bp;
complex *CxMul(ap,bp);
complex *ap, *bp;
complex *CxDiv(ap,bp);
complex *ap, *bp;
complex *CxSqrt(cp);
complex *cp;
complex *CxScal(cp,s);
complex *cp;
double s;
complex *CxNeg(cp);
complex *cp;
complex *CxConj(cp);
complex *cp;
complex *CxCopy(ap,bp);
complex *ap, *bp;
complex *CxCons(cp,r,i);
complex *cp;
double r, i;
complex *CxPhsr(cp,m,p);
complex *cp;
double m, p;
double CxReal(cp);
complex *cp;
double CxImag(cp);
complex *cp;
double CxAmpl(cp);
complex *cp;
double CxPhas(cp);
complex *cp;
complex *CxAllo( );
void CxFree(cp);
complex *cp;
DESCRIPTION
These routines perform arithmetic
and other useful operations on complex numbers.
An appropriate data structure
complex
is defined in the header file;
all access to
complex
data should be
via
these predefined functions.
(See
HINTS
for further information.)
In the following descriptions,
the names
a,
b,
and
c
represent the
complex
data addressed by the corresponding pointers
ap,
bp,
and
cp.
CxAdd
adds
b
to
a
and returns a pointer to the result.
CxSub
subtracts
b
from
a
and returns a pointer to the result.
CxMul
multiplies
a
by
b
and returns a pointer to the result.
CxDiv
divides
a
by
b
and returns a pointer to the result.
The divisor must not be precisely zero.
CxSqrt
replaces
c
by the ``principal value'' of its square root
(one having a non-negative imaginary part)
and returns a pointer to the result.
CxScal
multiplies
c
by the scalar
s
and returns a pointer to the result.
CxNeg
negates
c
and returns a pointer to the result.
CxConj
conjugates
c
and returns a pointer to the result.
CxCopy
assigns the value of
b
to
a
and returns a pointer to the result.
CxCons
constructs the complex number
c
from its real and imaginary parts
r
and
i,
respectively,
and returns a pointer to the result.
CxPhsr
constructs the complex number
c
from its ``phasor'' amplitude and phase (given in radians)
m
and
p,
respectively,
and returns a pointer to the result.
CxReal
returns the real part of the complex number
c.
CxImag
returns the imaginary part of the complex number
c.
CxAmpl
returns the amplitude of the complex number
c.
CxPhas
returns the phase of the complex number
c,
as radians in the range @(- pi , pi ]@.
CxAllo
allocates storage for a
complex
datum; it returns
NULL
(defined as 0 in
<stdio.h>)
if not enough storage is available.
CxFree
releases storage previously allocated by
CxAllo.
The contents of such storage must not be used afterward.
HINTS
The
complex
data type consists of real and imaginary components;
CxReal
and
CxImag
are actually macros that access these components directly.
This allows addresses of the components to be taken,
as in the following EXAMPLE.
The complex functions are designed to be nested;
see the following EXAMPLE.
For this reason,
many of them modify the contents of their first parameter.
CxCopy
can be used to create a ``working copy'' of
complex
data that would otherwise be modified.
The square-root function is inherently double-valued;
in most applications, both roots should receive equal consideration.
The second root is the negative of the ``principal value''.
EXAMPLE
The following program is compiled by the command
$ cc -I/usr/local/include example.c /usr/local/lib/libcomplex.a -lm
It reads in two complex vectors,
then computes and prints their inner product.
#include <stdio.h>
#include <complex.h>
main( argc, argv )
int argc;
char *argv[];
{
int n; /* # elements in each array */
int i; /* indexes arrays */
complex a[10], b[10]; /* input vectors */
complex s; /* accumulates scalar product */
complex *c = CxAllo(); /* holds cross-term */
if ( c == NULL )
{
(void)fprintf( stderr, ``not enough memory\n'' );
return 1;
}
(void)printf( ``\nenter number of elements: '' );
(void)scanf( `` %d'', &n );
/* (There really should be some input validation here.) */
(void) printf( ``\nenter real, imaginary pairs for first array:\n'' );
for ( i = 0; i < n; ++i )
(void)scanf( `` %lg %lg'', &CxReal( &a[i] ), &CxImag( &a[i] ) );
(void)printf( ``\nenter real, imaginary pairs for second array:\n'' );
for ( i = 0; i < n; ++i )
(void)scanf( `` %lg %lg'', &CxReal( &b[i] ), &CxImag( &b[i] ) );
(void)CxCons( &s, 0.0, 0.0 ); /* initialize accumulator */
for ( i = 0; i < n; ++i )
(void)CxAdd( &s, CxMul( &a[i], CxConj( CxCopy( c, &b[i] ) ) ) );
(void)printf( ``\nproduct is (%g,%g)\n'', CxReal( &s ), CxImag( &s ) );
CxFree( c );
return 0;
}
FILES
/usr/local/include/complex.h header file containing definitions
/usr/local/lib/libcomplex.a complex run-time support library
AUTHORS
Douglas A. Gwyn, BRL/VLD-VMB
Jeff Hanes, BRL/VLD-VMB (original version of
CxSqrt)
Index
- NAME
-
- SYNOPSIS
-
- DESCRIPTION
-
- HINTS
-
- EXAMPLE
-
- FILES
-
- AUTHORS
-
This document was created by
man2html,
using the manual pages.
Time: 06:31:15 GMT, December 12, 2024