those speckles are why i use a probabilistic ("cloud") intersection algorithm: there is essentially no surface there (i.e. there is no fixed step size that will give coherent results).
also, when doing a close-up zoom like this you'll want to use a much smaller step size to eliminate the "layering" artefacts.
I'd be interested to see what your algorithm makes of this one

I reduced the step-size by a factor of 10 on this one compared to the others, I didn't try reducing it further because even the render I did took 35mins at 640*480 ! (At the moment my step-size reduction algorithm isn't as "smart" as it should be - it reduces *all* step sizes when ideally it should only reduce them as the solid is approached, though actually for most of the errors I get with this algorithm I think that simply: for a given ray after calculating the next step size check that step size against the current minimum at that iteration depth, if it's larger than the current minimum for that iteration depth then step the current minimum instead, if it's smaller then update the current minimum).
OK I now have two algorithms that work pretty well without requiring the derivative. They both work based on the directional iteration density at each step along the viewing ray, one based on the classic "s = u*t + 0.5*a*t^2" and the other loosely based on the Newton step i.e. f()/f'(). The problem with both methods was that a ray passing close to "solid" but missing would then give large values for the calculated step distances just after passing the solid - the solution (as I mentioned above) is to check each new step size against the minimum for the given iteration depth (for that ray) and if it's larger then use the step size for that depth instead, otherwise use the step distance *and* store it as the new minimum for that iteration depth - I also test and conditionally store it for the next 3 higher iteration levels.
Both these methods produce results comparable to full distance estimator and both are between 3.5 and 4 times slower than full DE when used on quaternionic or standard hypercomplex fractals *but* both methods will work when you can't efficiently get the derivative and also for Julibrots and similar formulas where DE has issues in any case. The method solving "s = u*t + 0.5*a*t^2" for t is probably slightly better overall and in that case you have to check for "a" being zero otherwise you get specks (even in the middle of enpty space) - use s=ut instead here

However if the main iteration loop of the fractal is slow (e.g. involving transcendentals) then the f()/f'() method will be better since that only requires the single delta value not the double delta i.e. you only have to iterate at step and step + a bit rather than at step, step + a bit and step - a bit.
Note that 3.5 to 4 times slower (on quaternions and standard hypercomplex) than DE is still around 8.5 times faster than my old routine - though just out of interest I'm going to try the iteration depth limitation trick in that routine too and see how much it helps
