packages icon



 COMPLEX(3V)                                                     COMPLEX(3V)
                                    LOCAL



      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;




                                    - 1 -       Formatted:  November 14, 2024






 COMPLEX(3V)                                                      COMPLEX(3V)
                                    LOCAL



      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.





                                    - 2 -      Formatted:  November 14, 2024






 COMPLEX(3V)                                                     COMPLEX(3V)
                                    LOCAL



      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''.

























                                    - 3 -      Formatted:  November 14, 2024






 COMPLEX(3V)                                                     COMPLEX(3V)
                                    LOCAL



 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



                                    - 4 -      Formatted:  November 14, 2024






 COMPLEX(3V)                                                     COMPLEX(3V)
                                    LOCAL



      /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)

















































                                    - 5 -      Formatted:  November 14, 2024