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 |
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 |
||
int width = 32; // basic width of a zx81 |
|||
int height = 22; // basic width of a zx81 |
|||
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 = ". |
//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* |
short x0 = s(s(px*X1) / width) - X2; |
||
short y0 = ((py* |
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; |
||
short xSqr; |
|||
short ySqr; |
|||
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)>> |
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> |
||