[squeak-dev] Quadrangle >> exampleInViewer baby graphics bug

Levente Uzonyi leves at elte.hu
Sun Apr 25 11:05:05 UTC 2010


On Sun, 25 Apr 2010, Lawson English wrote:

> Igor Stasenko wrote:
>> On 24 April 2010 10:55, Lawson English <lenglish5 at cox.net> wrote:
>> 
>>> Lawson English wrote:
>>> 
>>>> Thanks. I had gotten that far with John Dougan's help and tried to save
>>>> back to the repository but it wouldn't accept since I lack a password. 
>>>> I
>>>> converted all references of Floats to Fractions just to see if there was 
>>>> an
>>>> easy way to give it higher precision but it slowed down to < Apple ][ 
>>>> speeds
>>>> when I did that.
>>>> 
>>>> 
>>>> Obviously the naive way isn't going to work. I gotta think there's some
>>>> glitch with what I did, or incompatibility with the algorithm and
>>>> Fractions....
>>>> 
>>>>
>>>> 
>>> Or maybe  things like x^100/y^100   takes a rather long time to 
>>> calculate...
>>>
>>> 
>> 
>> you can optimize, rather than multiplying x*x*...*x 100 times in a row,
>> 
>> use a power of two numerics.
>> Given that:
>> x^y = (x^a)*(x^b)
>> where y = a+b
>> 
>> so,
>> 
>> x^100 = (x^64)*(x^32)*(x^4)
>> 
>> then, you can reuse an intermediate results of computation i.e:
>> 
>> x2 := x*x.
>> x4 := x2*x2.
>> x8 := x4*x4.
>> x16 := x8*x8.
>> x32 := x16*x16.
>> x64 := x32*x32.
>> 
>> result := x64*x32*x4.
>> 
>> so, totally 8 multiplications, instead of 100.
>>
>> 
> Interesting. I'm not quite sure if it would work for colorizing the M set 
> boundaries though, since that is typically done based on the number of 
> iterations before the number goes out of bounds.
>
> I guess a logarithmic index could be used for  the color table instead of a 
> linear index...
>
> I worked out a simple way to truncate calculations to an arbitrary number of 
> digits.  Unless my algorithm is wrong, I can do 100 recursive 
> Complex>>squared calculations at 1000 decimal points of precision in only 17 
> seconds (i.e. 100TimesRepeat: ["z := z^2"]). Which is a tad too slow for the 
> M set.
> [ b:= b*b. b real: (ScaledDecimal readFrom: (b real)asString).   b imaginary: 
> (ScaledDecimal readFrom: (b imaginary) asString)]

Use [b squared] instead of [b * b], it's faster for Fractions and 
ScaledDecimals.

Do not convert the number to string and then to number again, it's just 
waste of time.


Levente


>
> where the  real and imaginary  were already set as scaledDecimal: 1000
>
> so a test after each new run would give 7 levels of color for z^128 and run 
> 12 times faster.
>
> only 1.4 seconds per pixel. Getting close... ;-)
>
>
> Lawson
>
>
>
>
>
>
>
>



More information about the Squeak-dev mailing list