in reply to Re^2: Fractal structure: PDL, memory, time
in thread Fractal structure: PDL, memory, time
Try these. fc() is just an Inline C version of f().
I'm pretty sure that they are now correct, but you should verify them yourself.
#! perl -slw use strict; use Inline C => << '__C__', NAME => "_627288"; # => CLEAN_AFTER_BUILD +=> 0; #include <stdio.h> int fc( double x, double y, int d ) { double bsize = pow( 4, ( d-1 ) ); if( x == y ) return d; else if( (int)( x / 4 ) == (int)( y / 4 ) ) return d-1; else if( (int)( x / bsize ) == (int)( y / bsize ) ) return 1 + fc( fmod( x, bsize ), fmod( y, bsize ), d-1 ); else return fc( fmod( x, bsize ), fmod( y, bsize ), d-1 ); } __C__ sub f{ my( $x, $y, $d ) = @_; my $bsize = 4**($d-1); if( $x == $y ) { return $d } elsif( int( $x / 4 ) == int( $y / 4 ) ) { return $d-1; } elsif( int( $x / $bsize ) == int( $y / $bsize ) ) { return 1 + f( $x % $bsize, $y % $bsize, $d-1 ); } else{ return f( $x % $bsize, $y % $bsize, $d-1 ); } }
Using this I have produced plots of 1000x1000 chunks upto level 31 successfully. At that point the coordinates get so large that they blow the limits of doubles. I'm also fairly sure that you are loosing precision long before level 31. At level 16 everything appears to check out.
I don't think any single set of 20 lines of code has ever (in the best part of 30 years), given me as much trouble to wrap my brain around as this!
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^4: Fractal structure: PDL, memory, time
by FFRANK (Beadle) on Jul 25, 2007 at 17:08 UTC | |
by BrowserUk (Patriarch) on Jul 25, 2007 at 18:47 UTC | |
by FFRANK (Beadle) on Jul 26, 2007 at 02:21 UTC |