Fix #1192: Proper hashCode() for Float and Double.

Because of the common encoding for integer and floating point
values, the hashCode of Floats and Doubles must align with that
of Ints for the common values.

For other values, we use the hashCode specified by the JavaDoc
for *Doubles*, even for values which are valid Float values.
Because of the previous point, we cannot align completely with
the Java specification, so there is no point trying to be a bit
more aligned here. Always using the Double version should
typically be faster on VMs without fround support because we
avoid several fround operations.