A prvalue of floating-point type can be converted to a prvalue of
another floating-point type.
If the source value can be exactly
represented in the destination type, the result of the conversion is
that exact representation.
If the source value is between two adjacent
destination values, the result of the conversion is an
implementation-defined choice of either of those values.
Otherwise, the behavior is undefined.