• C

# Testing wheter a complex number is in the mandelbrot set

Hi,
Im trying to write some C that will test whether a complex number in the form a + bi lies within the madelbrot set.
To lie within the set C has to be iterated 200 times without the result going over 2.
to start with the values are set to 0 and the first iteration is does on the zero values, then the real and imaginary parts of C are added and if the modulus of the new answer is less then 2 then the loop continues, if not it outputs that C is not in the mandelbrot set.

For some reason my code always outputs
Time until 2 is exceeded = 2

I cant quite see where Im going wrong, I am pretty new to C.

Here is my code.
Thanks for any help

#include <stdio.h>
#include  <math.h>

int main() {
mSetTest(2.0, 2.0);

return (0);
}

int mSetTest(double c_re, double c_im)
{
int i, count;
float real = c_re;
float imag = c_im;
float zreal, zimag = 0;
float zrealans,zimagans,testreal,testimag;
//Perform 200 Iterations to test wheter C is in Mandelbrot set
for(i=1; i<200; i++)
{

zrealans = (zreal*zreal)-(zimag*zimag);

zimagans = (zreal * zimag) * 2;

testreal = zrealans+real;

testimag = zimagans + imag;

if (sqrt((testreal*testreal) + (testimag*testimag))>2)
{   /*Increase the counter and print how many
iterations were performed before exceeding 2
*/
count ++;
printf("Times until 2 is exceeded =%i\n", count);
return (0);
}
else
{   /*Increase the counter and set the initial variables to the new ones */
count ++;
zreal=testreal;
zimag=testimag;

}
return (i);
}
/*If iterations go greater than 200 then C is in the mandelbrot set*/
printf("C is in the mandelbrot set");
}
###### Who is Participating?

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
On the first iteration:
real is  2.0
imag is 2.0
zreal is 0
zimag is 0

Therefore
zrealans is 0
zimagans is 0
testreal is 2.0
testimag is 2.0

Therefore
sqrt((testreal*testreal) + (testimag*testimag)) is sqrt ((2*2) + (2*2) which is sqrt (8) which is > 2.   Thus you always take the first branch, print the message, and return.

Gary

Author Commented:
I have changed my code slighty my mSetTest now looks like below.
But now, no matter what values I pass it for c_re and c_im my program always outputs Time until 2 is exceeded = 1

!!

int mSetTest(double c_re, double c_im)
{
int i;
int count = 0;
float real = c_re;
float imag = c_im;
float zreal, zimag = 0;
float zrealans,zimagans,testreal,testimag;
//Perform 200 Iterations to test wheter C is in Mandelbrot set
for(i=0; i<199; i++)
{

zrealans = (zreal*zreal)-(zimag*zimag);

zimagans = (zreal * zimag) * 2;

testreal = zrealans+real;

testimag = zimagans + imag;

if (sqrt((testreal*testreal) + (testimag*testimag))>2)
{   /*Increase the counter and print how many
iterations were performed before exceeding 2
*/
count ++;
printf("Times until 2 is exceeded =%i\n", count);
return (0);
}
else
{   /*Increase the counter and set the initial variables to the new ones */
count ++;
zreal=testreal;
zimag=testimag;

}
return (i);
}
Commented:
Silly me (and silly you):

float zreal, zimag = 0;

doesn't initialize zreal, only zimag.  Personally, I prefer the style of initialization that puts each variable on its own line, i.e.
float zreal = 0.0;
float zimag = 0.0;

Gary

Experts Exchange Solution brought to you by