Compare Fixed-Point and Floating-Point Computation in Mandelbrot Set
This example shows the difference between fixed-point numbers and floating-point numbers by computing the Mandelbrot set using each data type. For more information, see Fixed-Point Data in Stateflow Charts.
The Mandelbrot set is the set of complex numbers, , for which this sequence does not diverge:
In this example, a Stateflow® chart creates two images of the Mandelbrot set by using fixed-point and floating-point computations. The chart wakes and calls the helper function sf_mandel_gui
to initialize the display and obtain the initial pixel and figure information. Then the chart iterates through each row and column in the figure. The pixels in each figure represent points in the complex plane.
The x-coordinate of a pixel represents the real part of a complex number and the y-coordinate represents the imaginary part. For each pixel, the chart calls the graphical functions mandel_fix
and mandel_double
to compute the number of iterations it takes to determine whether the pixel is in the Mandelbrot set and maps the number to a color in a colormap. After the chart updates every pixel in the figures, the chart enters the Wait
state and sleeps until you click on the image in the figure window to zoom into the figure.
Compute Mandelbrot Set by Using Graphical Functions
The mandel_double
function uses floating-point computation to compute the number of iterations required to determine if the point is not in the Mandelbrot set. If the sequence does not diverge before the number of local_colors
iterations, the function determines the point is in the Mandelbrot set.
The mandel_fix
function uses fixed-point computation. a0
and b0
are fixed-point numeric objects constructed from the input values. cn
is a fixed-point numeric object with twice the word length and fraction length as a0
and b0
.
The fixed-point numeric object properties are specified in the Property Inspector, in the Fixed-point properties section. The chart uses a fixed-point numeric object with two's component overflow that rounds to negative infinity and has a word length of 32 and a fraction length of 26 for products and sums.
fimath('OverflowAction','Wrap',... 'RoundingMethod','Floor',... 'ProductMode', 'SpecifyPrecision',... 'ProductWordLength', 32,... 'ProductFractionLength', 26,... 'SumMode', 'SpecifyPrecision',... 'SumWordLength', 32,... 'SumFractionLength', 26)
Run the Simulation
To start the simulation, press Run. In the figure window x-axis displays the interval from -2 to 1 and the y-axis displays the interval from -1.5 to 1.5. The color of the pixel corresponds to the number of iterations calculated in mandel_fix
or mandel_double
. Pixels that correspond to a complex number in the Mandelbrot set are dark red. Dark blue pixels indicate that mandel_fix
or mandel_double
required fewer iterations to determine the sequence diverged, and brighter colors indicate sequences that required more iterations to diverge.
To zoom in on a portion of the image, click and drag in the image window.
Observe the differences between the fixed-point image and the double image. The fixed-point image contains false positives due to the imprecision in comparison to floating point computations. Each computation in mandel_fix
takes the floor of value as the rounding method. After many iterations, the rounding compounds and produces a round-off error that occurs when a point not in the Mandelbrot set does not produce a value of r2
that surpasses the threshold of 4 in the maximum number of iterations.
To zoom out, restart the simulation. The simulation continues to run until you click Stop.