"
a2 is long (64 bit) and passing to a float (32 bit), which is narrowing"
This is plain wrong.
long is convertable to
float because the range of a long is accomodated by a float.
Take a good look at what the JLS says:
5.1.2 Widening Primitive Conversion
The following 19 specific conversions on primitive types are called the widening primitive conversions:
* byte to short, int, long, float, or double
* short to int, long, float, or double
* char to int, long, float, or double
* int to long, float, or double
* long to float or double
* float to double
Widening primitive conversions do not lose information about the overall magnitude of a numeric value.
<SNIP>
Conversion of an int or a long value to float, or of a long value to double, may result in loss of precision-that is, the result may lose some of the least significant bits of the value. In this case, the resulting floating-point value will be a correctly rounded version of the integer value, using IEEE 754 round-to-nearest mode (�4.2.4).