# C4LIB A Float Precision Complex Arithmetic Utility Library

C4LIB is a C library which contains routines for "C4" or "float complex" arithmetic.

The original C specification did not include support for complex numbers. The "C99" version of the ANSI standard added specifications for a complex number datatype with either float, double and long double components, the extension of existing arithmetic operations and functions to the new datatypes and the addition of a number of new functions unique to complex numbers.

To use the structures and functions of this library, it is necessary that the user's source code invoke the include file:

``````
# include
``````

A complex number may be declared as

• float complex, in which case the real and imaginary parts will be floats;
• double complex, in which case the real and imaginary parts will be doubles;
• long double complex, in which case the real and imaginary parts will be long doubles;

The constant I is defined to be equal to the imaginary unit. To assign a numeric value to a complex number, you must multiply the imaginary part by I:

``````
float complex c;

c = 3 + 4 * I;
``````

The declaration can include an initialization:

``````
float complex c = 3 - 4 * I;
``````

To examine the real or imaginary parts of a complex variable, the functions creal() and cimag() can be used:

``````
float complex c = 3 + 4 * I;
printf ( "  Expecting value 3, got %f\n", creal ( c ) );
printf ( "  Expecting value 4, got %f\n", cimag ( c ) );
``````

There are 22 functions defined for float complex, double complex, and long double complex data types. Here are the headers for the float complex functions:
FunctionValue
float = cabs(float complex)absolute value of c
float complex = cacos(float complex)inverse cosine of c
float complex = cacosh(float complex)inverse hyperbolic cosine of c
float = carg(float complex)argument of c
float complex = casin(float complex)inverse sine of c
float complex = casinh(float complex)inverse hyperbolic sine of c
float complex = catan(float complex)inverse tangent of c
float complex = catanh(float complex)inverse hyperbolic tangent of c
float complex = ccos(float complex)cosine of c
float complex = ccosh(float complex)hyperbolic cosine of c
float complex = cexp(float complex)exponential of c
float = cimag(float complex)imaginary part of c
float complex = clog(float complex)logarithm of c
float complex = conj(float complex)conjugate of c
float complex = cpow(float complex, float complex)c1 to the c2 power
float complex = cproj(float complex)projection of c onto Riemann sphere
float = creal(float complex)real part of c
float complex = csin(float complex)sine of c
float complex = csinh(float complex)hyperbolic sine of c
float complex = csqrt(float complex)square root of c
float complex = ctan(float complex)tangent of c
float complex = ctanh(float complex)hyperbolic tangent of c

C4LIB, in part, duplicates some of the functionality that was added by the C99 standard. The C4LIB versions should be of historical interest only. Other functions provided by C4LIB, however, may be of more substantial interest.

### Languages:

C4LIB is available in a C version and a C++ version and a FORTRAN77 version and a FORTRAN90 version and a MATLAB version and a Python version.

### Related Programs:

BLAS1_C, a C library which contains basic linear algebra routines for vector-vector operations, using float complex arithmetic.

C4_COMPLEX_LIB, a C library which defines a single precision complex variable or "C4" as a structure, and implements certain corresponding elementary functions.

C8LIB, a C library which implements certain elementary functions for "C8" or double precision complex variables using the C99 standard "double complex" datatype.

COMPLEX_NUMBERS, a C program which demonstrates some simple features involved in the use of complex numbers in C programming.

I4LIB, a C library which contains many utility routines, using "I4" or "single precision integer" arithmetic.

I8LIB, a C library which contains many utility routines, using "I8" or "double precision integer" arithmetic.

L4LIB, a C library which contains many utility routines, using one byte logical (L4) variables.

MY_COMPLEX, a C++ class for complex numbers;

R4LIB, a C library which contains many utility routines, using "R4" or "single precision real" arithmetic.

R8LIB, a C library which contains many utility routines, using "R8" or "double precision real" arithmetic.

### List of Routines:

• C4_ABS returns the absolute value of a C4.
• C4_ACOS evaluates the inverse cosine of a C4.
• C4_ACOSH evaluates the inverse hyperbolic cosine of a C4.
• C4_ARG returns the argument of a C4.
• C4_ASIN evaluates the inverse sine of a C4.
• C4_ASINH evaluates the inverse hyperbolic sine of a C4.
• C4_ATAN evaluates the inverse tangent of a C4.
• C4_ATANH evaluates the inverse hyperbolic tangent of a C4.
• C4_CONJ conjugates a C4.
• C4_COPY copies a C4.
• C4_COS evaluates the cosine of a C4.
• C4_COSH evaluates the hyperbolic cosine of a C4.
• C4_CUBE_ROOT computes the principal cube root of a C4.
• C4_DIV divides two C4's.
• C4_DIV_R4 divides a C4 by an R4.
• C4_EXP exponentiates a C4.
• C4_I returns the value of I as a C4
• C4_IMAG returns the imaginary part of a C4.
• C4_INV inverts a C4.
• C4_LE_L1 := X <= Y for C4 values, and the L1 norm.
• C4_LE_L2 := X <= Y for C4 values, and the L2 norm.
• C4_LE_LI := X <= Y for C4 values, and the L-oo norm.
• C4_LOG evaluates the logarithm of a C4.
• C4_MAG returns the magnitude of a C4.
• C4_MUL multiplies two C4's.
• C4_NEG negates a C4.
• C4_NINT returns the nearest complex integer of a C4.
• C4_NORM_L1 evaluates the L1 norm of a C4.
• C4_NORM_L2 evaluates the L2 norm of a C4.
• C4_NORM_LI evaluates the L-infinity norm of a C4.
• C4_NORMAL_01 returns a unit pseudonormal C4.
• C4_ONE returns the value of 1 as a C4
• C4_PRINT prints a C4.
• C4_REAL returns the real part of a C4.
• C4_SIN evaluates the sine of a C4.
• C4_SINH evaluates the hyperbolic sine of a C4.
• C4_SQRT computes a square root of a C4.
• C4_SUB subtracts two C4's.
• C4_SWAP swaps two C4's.
• C4_TAN evaluates the tangent of a C4.
• C4_TANH evaluates the hyperbolic tangent of a C4.
• C4_TO_CARTESIAN converts a C4 to Cartesian form.
• C4_TO_POLAR converts a C4 to polar form.
• C4_UNIFORM_01 returns a unit pseudorandom C4.
• C4_ZERO returns the value of 0 as a C4
• C4MAT_ADD combines two C4MAT's with complex scale factors.
• C4MAT_ADD_R4 combines two C4MAT's with real scale factors.
• C4MAT_COPY copies one C4MAT to another.
• C4MAT_COPY_NEW copies one C4MAT to a "new" C4MAT.
• C4MAT_FSS factors and solves a system with multiple right hand sides.
• C4MAT_FSS_NEW factors and solves a system with multiple right hand sides.
• C4MAT_IDENTITY_NEW sets a C4MAT to the identity.
• C4MAT_INDICATOR_NEW returns the C4MAT indicator matrix.
• C4MAT_MINVM returns inverse(A) * B for C4MAT's.
• C4MAT_MINVM_NEW returns inverse(A) * B for C4MAT's.
• C4MAT_MM multiplies two C4MAT's.
• C4MAT_MM_NEW multiplies two C4MAT's.
• C4MAT_NINT rounds the entries of a C4MAT.
• C4MAT_NORM_FRO returns the Frobenius norm of a C4MAT.
• C4MAT_NORM_L1 returns the matrix L1 norm of a C4MAT.
• C4MAT_NORM_LI returns the L-infinity norm of a C4MAT.
• C4MAT_PRINT prints a C4MAT.
• C4MAT_PRINT_SOME prints some of a C4MAT.
• C4MAT_SCALE scales a C4MAT by a complex scale factor.
• C4MAT_SCALE_R4 scales a C4MAT by a real scale factor
• C4MAT_UNIFORM_01 returns a unit pseudorandom C4MAT.
• C4MAT_ZERO_NEW returns a new zeroed C4MAT.
• C4VEC_COPY copies a C4VEC to another.
• C4VEC_COPY_NEW copies a C4VEC to a "new" C4VEC.
• C4VEC_NINT rounds the entries of a C4VEC.
• C4VEC_NORM_L2 returns the L2 norm of a C4VEC.
• C4VEC_PRINT prints a C4VEC.
• C4VEC_PRINT_PART prints "part" of a C4VEC.
• C4VEC_PRINT_SOME prints "some" of a C4VEC.
• C4VEC_SORT_A_L2 ascending sorts a float complex array by L2 norm.
• C4VEC_SPIRAL returns N points on a spiral between C1 and C2.
• C4VEC_UNIFORM_01_NEW returns a unit pseudorandom C4VEC.
• C4VEC_UNITY returns the N roots of unity in a C4VEC.
• CARTESIAN_TO_C4 converts a Cartesian form to a C4.
• POLAR_TO_C4 converts a polar form to a C4.
• R4_CSQRT returns the complex square root of an R4.
• R4POLY2_ROOT returns the two roots of a quadratic polynomial.
• R4POLY3_ROOT returns the three roots of a cubic polynomial.
• R4POLY4_ROOT returns the four roots of a quartic polynomial.

You can go up one level to the C source codes.

Last revised on 09 March 2014.