https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108742
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Note, internally in standard excess precision, 4.2 seen by the lexer is actually EXCESS_PRECISION <double, 4.2L>, when it is assigned to a double variable or cast to double (i.e. in places where C/C++ require the excess precision to be converted to the narrower one) it is rounded to double, but when used as (long double)4.2 it is the same as 4.2L and even (long double)d == (long double)4.2 should behave the same as (long double)d == 4.2 and d == 4.2.