Implementation of Complex Numbers in C

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • stdq
    New Member
    • Apr 2013
    • 94

    #1

    Implementation of Complex Numbers in C

    In this article, I'll show you a way to implement complex numbers with the C programming language. Please note there is no warranty when it comes to using the code here provided.

    A complex number is a number, say, z, such that z = realPart + i * imaginaryPart, where i is the imaginary unit, sometimes denoted by j. Also, i * i = -1, and this is important when finding the product/division of two complex numbers.

    Naturally, we can implement a complex number as a struct:

    Code:
    /* Definition of a Complex number: */
    typedef struct complex {
        double realPart;
        double imaginaryPart;
    } Complex;
    We can separate the interface from the implementation as follows.

    First, we have the header Complex.h, which defines the Complex structure and contains the prototypes for the functions that manipulate one or more Complex numbers:

    Code:
    /* Complex.h */
    
    #ifndef COMPLEX_H
    #define COMPLEX_H
    
    /* Definition of a Complex number: */
    typedef struct complex {
        double realPart;
        double imaginaryPart;
    } Complex;
    
    /* Prototypes for functions to manipulate Complex number(s) (these functions are implemented in file Complex.c): */
    Complex addition( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 );
    Complex subtraction( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 );
    Complex multiplication( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 );
    Complex division(  const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 );
    void print( const Complex *pointerToComplexNumber );
    
    #endif
    The file Complex.c implements the functions above:

    Code:
    /* Complex.c */
    
    #include <stdio.h>
    #include "Complex.h"
    
    /* Adds two Complex numbers, returning a new one, without modifying the ones received: */
    Complex addition( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 )
    {
        Complex complexNumber3;
        
        complexNumber3.realPart = pointerToComplexNumber1->realPart + pointerToComplexNumber2->realPart;
        complexNumber3.imaginaryPart = pointerToComplexNumber1->imaginaryPart + pointerToComplexNumber2->imaginaryPart;
        
        return complexNumber3;
    }
    
    /* Subtracts two Complex numbers, returning a new one, without modifying the ones received: */
    Complex subtraction( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 )
    {
        Complex complexNumber3;
        
        complexNumber3.realPart = pointerToComplexNumber1->realPart - pointerToComplexNumber2->realPart;
        complexNumber3.imaginaryPart = pointerToComplexNumber1->imaginaryPart - pointerToComplexNumber2->imaginaryPart;
        
        return complexNumber3;
    }
    
    /* Multiplies two Complex numbers, returning a new one, without modifying the ones received: */
    Complex multiplication( const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 )
    {
        Complex complexNumber3;
        
        complexNumber3.realPart = pointerToComplexNumber1->realPart * pointerToComplexNumber2->realPart -
            pointerToComplexNumber1->imaginaryPart * pointerToComplexNumber2->imaginaryPart;
            
        complexNumber3.imaginaryPart = pointerToComplexNumber1->realPart * pointerToComplexNumber2->imaginaryPart +
            pointerToComplexNumber1->imaginaryPart * pointerToComplexNumber2->realPart;
        
        return complexNumber3;
    }
    
    /* Divides two Complex numbers, returning a new one, without modifying the ones received: */
    Complex division(  const Complex *pointerToComplexNumber1, const Complex *pointerToComplexNumber2 )
    {
        Complex complexNumber3;
        double commonDenominator = pointerToComplexNumber2->realPart * pointerToComplexNumber2->realPart +
            pointerToComplexNumber2->imaginaryPart * pointerToComplexNumber2->imaginaryPart;
        
        complexNumber3.realPart = ( pointerToComplexNumber1->realPart * pointerToComplexNumber2->realPart +
            pointerToComplexNumber1->imaginaryPart * pointerToComplexNumber2->imaginaryPart ) / commonDenominator;
        
        complexNumber3.imaginaryPart = ( pointerToComplexNumber1->imaginaryPart * pointerToComplexNumber2->realPart -
            pointerToComplexNumber1->realPart * pointerToComplexNumber2->imaginaryPart ) / commonDenominator;
        
        return complexNumber3;
    }
    
    /* Prints a Complex number in the form ( realPart ) + i( imaginaryPart ), without modifying it: */
    void print( const Complex *pointerToComplexNumber )
    {
        printf( "( %.4f ) + i( %.4f )", pointerToComplexNumber->realPart, pointerToComplexNumber->imaginaryPart );
    }
    Finally, we have a file called ComplexTest.c, which tests files Complex.c and Complex.h inside the main function, which is the starting point of our C program:

    Code:
    /* ComplexTest.c */
    
    #include <stdio.h>
    #include "Complex.h"
    
    int main( void )
    {
        Complex number1;
        Complex number2;
        Complex sumOfNumber1WithNumber2;
        Complex subtractionOfNumber2FromNumber1;
        Complex multiplicationOfNumber1WithNumber2;
        Complex divisionOfNumber1PerNumber2;
        
        number1.realPart = 1.2343;
        number1.imaginaryPart = 4.7621;
        
        number2.realPart = -3.213;
        number2.imaginaryPart = -9.8;
        
        sumOfNumber1WithNumber2 = addition( &number1, &number2 );
        subtractionOfNumber2FromNumber1 = subtraction( &number1, &number2 );
        multiplicationOfNumber1WithNumber2 = multiplication( &number1, &number2 );
        divisionOfNumber1PerNumber2 = division( &number1, &number2 );
        
        printf( "Number1 = " );
        print( &number1 );
        printf( "\nNumber2 = " );
        print( &number2 );
        printf( "\nNumber1 + Number2 = " );
        print( &sumOfNumber1WithNumber2 );
        printf( "\nNumber1 - Number2 = " );
        print( &subtractionOfNumber2FromNumber1 );
        printf( "\nNumber1 * Number2 = " );
        print( &multiplicationOfNumber1WithNumber2 );
        printf( "\nNumber1 / Number2 = " );
        print( &divisionOfNumber1PerNumber2 );
        putchar( '\n' );
        
        return 0;
    }
    To compile this program with Visual Studio 2013, from the command line, open the Developer Command Prompt for VS2013, go to the directory where the three files above are, and enter the command

    cl ComplexTest.c Complex.c

    Then, run the program with the command

    ComplexTest
Working...