Mandelbrot set: Difference between revisions

(→‎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:
<lang C>
/**
ascii Mandelbrot using 16 bits of fixed point integer maths with ana selectable fractional precision "8.8"in encodingbits.
 
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 <stdlib.h>
Line 2,647 ⟶ 2,652:
#include <stdint.h>
#include <string.h>
 
short s(short i);
short toPrec(double f, int bitsPrecision);
 
int main(int argc, char* argv[])
{
// chosen to match https://www.youtube.com/watch?v=DC5wi6iv9io
shortint width = 32; // textbasic width of a zx81
shortint height = 22; // textbasic heightwidth of a zx81
shortint zoom=13; // 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
//char * chr = ".,'~=+:;[/<&?oxOX-=X$# @.";
char * chr = "abcdefghijklmnopqr ";
short iters = strlen(chr);
//char * chr = ".,'~=+:;[/<&?oxOX#.";
short maxIters = strlen(chr);
 
short py=0;
while (py < height*zoom) {
 
short px=0;
while (px < width*zoom) {
 
// $380 = 3.5 $240=2.25 $180=1.5 $300=3
short x0 = s(s(px*0x380/zoomX1) / width) - 0x240X2;
short y0 = s(s(py*0x300/zoomY1) / height) - 0x180Y2;
 
short x=0;
Line 2,673 ⟶ 2,693:
short i=0;
 
whileshort (i < iters) {xSqr;
short xSqr = (x * x) >> 8ySqr;
short ySqr =while (yi *< ymaxIters) >> 8;{
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;
}
 
short xt = xSqr - ySqr + x0;
y = s(s(s(x * y) >>8 bitsPrecision) * 2 ) + y0;
x=xt;
 
i = i + 1;
}
 
i = i - 1;
 
Line 2,693 ⟶ 2,717:
 
px = px + 1;
 
}
 
Line 2,700 ⟶ 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>
 
<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>
 
Anonymous user