I wonder if you could explain the Overflow in floating-point types.
float.MaxValue == float.MaxValue + 1 // returns true
To get a float type temporary variable to actually hold a single precision value, it must have been loaded from a float variable in memory. The compiler is generally allowed to represent single-precision values with more precision than required, and tends to do so while the value is in a register. When it spills back to memory the extra precision is lost.