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