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:
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:
The file Complex.c implements the functions above:
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:
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
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;
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
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 );
}
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;
}
cl ComplexTest.c Complex.c
Then, run the program with the command
ComplexTest