> In my mind this is a consistency issue. Either
> integers should be a subtype of floats or they should not be. If "/" is
> defined as a float division operator then the fact that both integers
> are promoted is not magic it is simply the way the language works.

If integers are a subtype of float, then the "/" operator does not require
special magic to get round the type system. The / operator should always
take two floats and return a float.  If one of the float arguments is
actually
an integer, no problem under the principle of least surprise.  If the
interpreter
does special bit-twiddling magic to optimise numbers but keeps the type
system consistent, that's also no problem under the principle of least
surprise.

> Just rename the "/" operator in your mind to "the floatdiv operator"
> and it won't seem magic.

1/ 2 returns a floored integer, while 1/2.0 returns a float, so / is not
"floatdiv" when both arguments integers, only if any of the arguments is not
an integer.  In my experience, having two different division operators, has
helped avoid errors: one operator performs floored division and applies to
integers only (//), the other always returns a float and applies to any type
of number (/).

Cheers,
        Nat.