Mandelbrot set: Difference between revisions

Content added Content deleted
(→‎Normalized Counting, Distance Estimation, Mercator Maps and Perturbation Theory: Only Float64x2 are fast, but you need at least Float64x3. Therefore, the MultiFloats example has been replaced and superfluous whitespace has been deleted.)
Line 2,637: Line 2,637:
<lang C>
<lang C>
/**
/**
ascii Mandelbrot using fixed point integer maths with an "8.8" encoding.
ascii Mandelbrot using 16 bits of fixed point integer maths with a selectable fractional precision in bits.

See also line by line equivalent floating point impl to understand the changes needed ...https://github.com/Johnlon/mandelbrot
This is still only 16 bits mathc and allocating more than 6 bits of fractional precision leads to an overflow that adds noise to the plot..

This code frequently casts to short to ensure we're not accidentally benefitting from GCC promotion from short 16 bits to int.

gcc fixedPoint.c -lm

*/


16 bit shorts chosen for preparation for reimplementation as two bytes per number in assembler.
*/
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
Line 2,647: Line 2,652:
#include <stdint.h>
#include <stdint.h>
#include <string.h>
#include <string.h>

short s(short i);
short toPrec(double f, int bitsPrecision);


int main(int argc, char* argv[])
int main(int argc, char* argv[])
{
{
// chosen to match https://www.youtube.com/watch?v=DC5wi6iv9io
// chosen to match https://www.youtube.com/watch?v=DC5wi6iv9io
short width = 32; // text width of a zx81
int width = 32; // basic width of a zx81
short height = 22; // text height of a zx81
int height = 22; // basic width of a zx81
short zoom=1; // bigger = finer detail - leave at 1 for 32x22
int zoom=3; // bigger with finer detail ie a smaller step size - leave at 1 for 32x22

// params
short bitsPrecision = 6;
printf("PRECISION=%d\n", bitsPrecision);

short X1 = toPrec(3.5,bitsPrecision) / zoom;
short X2 = toPrec(2.25,bitsPrecision) ;
short Y1 = toPrec(3,bitsPrecision)/zoom ; // horiz pos
short Y2 = toPrec(1.5,bitsPrecision) ; // vert pos
short LIMIT = toPrec(4,bitsPrecision);



// fractal
// fractal
char * chr = ".,'~=+:;[/<&?oxOX# ";
//char * chr = ".:-=X$#@.";
char * chr = "abcdefghijklmnopqr ";
short iters = strlen(chr);
//char * chr = ".,'~=+:;[/<&?oxOX#.";
short maxIters = strlen(chr);


short py=0;
short py=0;
while (py < height*zoom) {
while (py < height*zoom) {

short px=0;
short px=0;
while (px < width*zoom) {
while (px < width*zoom) {

// $380 = 3.5 $240=2.25 $180=1.5 $300=3
short x0 = ((px*0x380/zoom) / width) - 0x240;
short x0 = s(s(px*X1) / width) - X2;
short y0 = ((py*0x300/zoom) / height) - 0x180;
short y0 = s(s(py*Y1) / height) - Y2;


short x=0;
short x=0;
Line 2,673: Line 2,693:
short i=0;
short i=0;


while (i < iters) {
short xSqr;
short xSqr = (x * x) >> 8;
short ySqr;
short ySqr = (y * y) >> 8;
while (i < maxIters) {
xSqr = s(x * x) >> bitsPrecision;
ySqr = s(y * y) >> bitsPrecision;


// Breakout if sum is > the limit OR breakout also if sum is negative which indicates overflow of the addition has occurred
if ((xSqr + ySqr) > 0x400) {
// The overflow check is only needed for precisions of over 6 bits because for 7 and above the sums come out overflowed and negative therefore we always run to maxIters and we see nothing.
// By including the overflow break out we can see the fractal again though with noise.
if ((xSqr + ySqr) >= LIMIT || (xSqr+ySqr) < 0) {
break;
break;
}
}


short xt = xSqr - ySqr + x0;
short xt = xSqr - ySqr + x0;
y = (((x * y)>>8) * 2 ) + y0;
y = s(s(s(x * y) >> bitsPrecision) * 2) + y0;
x=xt;
x=xt;


i = i + 1;
i = i + 1;
}
}

i = i - 1;
i = i - 1;


Line 2,693: Line 2,717:


px = px + 1;
px = px + 1;

}
}


Line 2,700: Line 2,723:
}
}
}
}

// convert decimal value to a fixed point value in the given precision
short toPrec(double f, int bitsPrecision) {
short whole = ((short)floor(f) << (bitsPrecision));
short part = (f-floor(f))*(pow(2,bitsPrecision));
short ret = whole + part;
return ret;
}

// convenient casting
short s(short i) {
return i;
}


</lang>
</lang>


<pre>
<pre>
$ gcc fixedPoint.c -lm && ./a.out
Output ...

.........,,,,,,,,,,,,,,,,,,,,,,,
PRECISION=6
........,,,,,,,,,,,,,,,,,,,,,,,,
aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcdcccbbbbbb
.......,,,,''''''''''',,,,,,,,,,
aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccddcbbbbb
......,,,'''''''~~=<=~'',,,,,,,,
aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbegfcdbbb
.....,,'''''''~~~=+[<+~~'',,,,,,
aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdccedbb
....,,'''''''~~~=+/ ;==~'',,,,,
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdcccb
....,''''''~~~=x/o& /;:/~'',,,,
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbcfdddcccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdded
...,''''''~===+[ /=''',,,
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbcccccddfcccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccc
...''''~= ++::/ /+~''',,
aaaaaaaaaaaaaaaaaabbbbbbbbbbbbbcccccdeccccccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbcc
...'~~~=+[ X / +~''',,
aaaaaaaaaaaaaaaaabbbbbbbbbbfcccccddeccccccccccccccccdddddeeeddddccccccbbbbbbbbbbbbbbbbbbbbbbbbbe
...~~~+:/o =~''',,
aaaaaaaaaaaaaaaabbbbbbbbbbcccccdddccccccccccccccdeddddeefigeeeddddecccccbbbbbbbbbbbbbbbbbbbbbbbb
... :=~''',,
aaaaaaaaaaaaaaaabbbbbbbecccccdddcccccccccccccdddddddddeefhmgfffddddedcccccbbbbbbbbbbbbbbbbbbbbbb
...~~~++/? =~''',,
aaaaaaaaaaaaaaabbbbbbbcccccccdcccccccccccccccdgddddddfeefgjpijjfdddddedccccccbbbbbbbbbbbbbbbbbbb
...'~~~=+; < +~''',,
aaaaaaaaaaaaaaabbbbbccccccdedccccccccccccccdddddddddeeefgkj ojgfedddddeccccccbbbbbbbbbbbbbbbbbbb
...''''~=&::::/ <+~''',,
aaaaaaaaaaaaaabbbbbcccccegeccccccccccccccdeedddddddeeeeghhkp hgheefddddecccccccbbbbbbbbbbbbbbbbb
...,''''''~===+/ /=''',,,
aaaaaaaaaaaaabbbbccccceddcccccccccccccccfddddddddeeeeefmlkr ihheeeedddddgccccccbbbbbbbbbbbbbbbb
....,''''''~~~= / & ?[:&~'',,,,
aaaaaaaaaaaaabbbccccddfcccccccccccccccedddddddddeeegffhnp rpjffeeeiddddcccccccbbbbbbbbbbbbbbb
....,,'''''''~~~=+/ [==~'',,,,,
aaaaaaaaaaaabbbcccddecccccccccccccccddddddddddeeffffgghm jgffeeeegdddccccccccbbbbbbbbbbbbb
.....,,'''''''~~~=+[<+~~'',,,,,,
aaaaaaaaaaabbbccdedccccccccccccccccdddddddddeefffffgghil khggffffeeeddccccccccbbbbbbbbbbbb
......,,,'''''''~~=&=~~',,,,,,,,
aaaaaaaaaaabbccdeccccccccccccccccddddddddeeef ijjhhhkijlo qkihjhgffgngeddcccccccbbbbbbbbbbbb
.......,,,,''''''''''',,,,,,,,,,
aaaaaaaaaabbcddccccccccccccccccdddddddfeeeefgjq lkk p n khhhiqifedcccccccdbbbbbbbbbbb
........,,,,,,,,,,,,,,,,,,,,,,,,
aaaaaaaaaabbccccccccccccccccccddddddefeeeeffgilq plk rrqgeddcccccccdbbbbbbbbbb
aaaaaaaaaabdccccccccccccccccdddhegeeeeeefffghiq mfeeddcccccccdbbbbbbbbb
aaaaaaaaaaccccccccccccccccdddeeeeeeeeeeffffhjklp phfeeddcccccccdcbbbbbbbb
aaaaaaaaabcccccccccccccddddegeeeeeeeeeffffhppp jgggedddccccccccbbbbbbbb
aaaaaaaaabccccccccccddddeefpifffffffffggggik hgfedddcccccccdcbbbbbbb
aaaaaaaaaccccccceddddddeeifl hgggjrhggggghj p qjnfdddcccccccdcbbbbbbb
aaaaaaaabccccddedddddefeefghqnokkloqiqhhhik ifdddcccccccdcbbbbbbb
aaaaaaaaccceddddddddgfeeffghir o n qmjiijo igfedddcccccccccbbbbbb
aaaaaaaaccddedddddeeeeeefgghkq lll lgfddddcccccccdcbbbbbb
aaaaaaaacddddddddeeeeeefhgjol rn geddddcccccccdcbbbbbb
aaaaaaaaedddddddeeeffggojjll hfeddddeccccccdcbbbbbb
aaaaaaaaddddddefffffggmkopmop ngfefdddfccccccdcbbbbbb
aaaaaaaaeeffgihggiihikk hfeefdddeccccccddbbbbbb
aaaaaaaa kigfgefdddecccccceebbbbbb
aaaaaaaaeeffhgjggghhhklqm ligfhefdddeccccccddbbbbbb
aaaaaaaaddddddefffffgggirq hffefdddeccccccdebbbbbb
aaaaaaaahdddddddeefgfggilkjk hfeedddeccccccddbbbbbb
aaaaaaaacddddddddeeeeeefhhhkl lfefdddeccccccdcbbbbbb
aaaaaaaaccddedddddefeeeeffgijo on qfedddcccccccdcbbbbbb
aaaaaaaabcceddddddddegeeefggik r kko jhfedddcccccccdcbbbbbb
aaaaaaaabccccddddddddefeeefijmk jkp kmiijlq qhfedddcccccccccbbbbbb
aaaaaaaaacccccccdddddddeeefh hhghi kjggghil r geddcccccccdcbbbbbbb
aaaaaaaaabccccccccccdddddefgnfgffghggggggghjm lj feddcccccccdcbbbbbbb
aaaaaaaaabccccccccccccccdddeffggeeeefffffggm igfefddcccccccdbbbbbbbb
aaaaaaaaaaccccccccccccccccdddeeeeeeeeeeffffhjm kgfeddcccccccdcbbbbbbbb
aaaaaaaaaabdccccccccccccccccdddfeeeeeeeegffgiikq feeddcccccccebbbbbbbbb
aaaaaaaaaabbccccccccccccccccccdddddegeeeegffgho p nheeddcccccchfbbbbbbbbb
aaaaaaaaaabbbddcccccccccccccccccdddddeeeeeefhm l ki jlnjeddcccccccdbbbbbbbbbb
aaaaaaaaaaabbccecccccccccccccccccdddddddfeeefir jii npm k ohgggineedcccccccdbbbbbbbbbbb
aaaaaaaaaaabbbccdddccccccccccccccccddddddddeeefggggggiik mjhhgfffffedddcccccccbbbbbbbbbbbb
aaaaaaaaaaaabbbcccedfcccccccccccccccdddddddddeegffffgghp hgffgeeeedddccccccccbbbbbbbbbbbb
aaaaaaaaaaaabbbbccccdddcccccccccccccccgdddddddddeegffgil ggfeeeeddddcccccccbbbbbbbbbbbbbb
aaaaaaaaaaaaabbbbbccccdddccccccccccccccfeddddddddeeeefgi l nkqgeeegeddddcccccccbbbbbbbbbbbbbbb
aaaaaaaaaaaaabbbbbbcccccdedccccccccccccccdedddddddeeeeeghik khhfeefdddddeccccccbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaabbbbbbccccccdddcccccccccccccddedddddddeeefigil jggfedddddddcccccbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaabbbbbbbcccccccdccccccccccccccdefdddddeeeffhlliimfdddddedccccccbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaabbbbbbbccccccdddccccccccccccccdddddddeeefg jggheddddedccccccbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaabbbbbbbbbccccccdddccccccccccccccdedddddefgiffeeddddeccccccbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaabbbbbbbbbbecccccdeeccccccccccccccceddddeffegddddgcccccbbbbbbbbbbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaaaabbbbbbbbbbbbcccccdddcccccccccccccccccddddddddccccccbbbbbbbbbbbbbbbbbbbbbbbbbbc
aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbccccddeccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbed
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbccceddcccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccd
aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbdcccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbecccc
aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccdebb
aaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdfccbbb
aaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcgdccbbbb
</pre>
</pre>