HaloO,

John M. Dlugosz wrote:
I don't know why he's calling it an "Int with non-uniform spacing" unless he is complaining about what happens when you store ints in floats: it rounds off to the mantissa size.

With uniform spacing you have

  constant $step = 1;

and

  $x++;  # means $x = $x + $step

whereas non-uniform is

  $x++;  # means $x = $x + $x.step;

You can make the second to subsume the first with

  multi method *step (Int) { 1 }

and optimize whenever you can prove that $x always
does Int. If you can't, you leave that to the runtime.

Going further with that you could define $a == $b to
actually mean abs($a-$b) < min($a.step, $b.step).
E.g. with the usual 64bit floats you have 0.5.step==2**-53
and (2**52).step==1. Then per definition

  multi method *step (Real) { 0 }

essentially means a real object can't step away from itself
or some such.

Given the above, the optimizer can e.g. take a sub that claims to
achieve its business with two Reals in such a way that ++ is
considered a noop and taken out of the code. If the code is not
up to that it can hardly be a function that properly handles two
Reals. If your test suite manages to detect that failure is another
question. But a good enough optimizer makes bad enough programs
reveal their realness or lack thereof ;)


Regards, TSa.
--

"The unavoidable price of reliability is simplicity" -- C.A.R. Hoare
"Simplicity does not precede complexity, but follows it." -- A.J. Perlis
1 + 2 + 3 + 4 + ... = -1/12  -- Srinivasa Ramanujan

Reply via email to