On Tue, 16 Jul 2002, Nicholas Clark wrote: > 5.8.0 does the full fun and games of integer or floating point comparison: > > perl5.8.0-64 -le '$a = ~0; $b = $a & ~1; printf "%x <=> %x\n", $a, $b; print $a <=> >$b; {use integer; print $a <=> $b}' > ffffffffffffffff <=> fffffffffffffffe > 1 > 1 > > IIRC the speed difference was hard to benchmark. However, the ability to > deal with large file offsets, windows device numbers and other 64 bit > quantities correctly was seen as useful.
Let's not lose sight of the forest for the trees here -- the comparisons are now *backwards*, which is considerably worse than imprecise. Here's what I think the multimethod dispatch version would look like, without the automatic multimethod dispatch: INTVAL cmp (PMC* value) { if (value->vtable == &Parrot_base_vtables[enum_class_PerlString]) { FLOATVAL fdiff = (FLOATVAL)self->cache.int_val - value->vtable->get_number(INTERP, value); if (fdiff == 0) { INTVAL idiff = SELF->cache.int_val - value->vtable->get_integer(INTERP, value); return idiff > 0 ? 1 : diff < 0 ? -1 : 0; } else { return fdiff > 0 ? 1 : -1; } } else if (value->vtable == &Parrot_base_vtables[enum_class_PerlNum]) { FLOATVAL diff; diff = (FLOATVAL)SELF->cache.int_val - value->vtable->get_number(INTERP, value); return diff > 0 ? 1 : diff < 0 ? -1 : 0; } else { /* int or indef */ INTVAL diff = SELF->cache.int_val - value->vtable->get_integer(INTERP, value); return diff > 0 ? 1 : diff < 0 ? -1 : 0; } } Why not drop something like this in for the moment, then take another look when we have multimethods? /s