Can there be a difference in bit-representation between a direct assignment of a floating point literal float x = 3.2f; and a double implicitly converted to a float float x2 = 3.2;?
I.e. is
#define EQUAL(FLOAT_LITERAL)\ FLOAT_LITERAL##f == static_cast<float>(FLOAT_LITERAL) EQUAL(3.2) && EQUAL(55.6200093490) // etc ... true for all floating point literals?
I ask this question, because clang or gcc do not complain about narrowing conversions if numbers are in the value range of float: Warning is enabled with -Wnarrowing:
float f {3.422222222222222222222222222222246454}; // no warning/ error although it should definitely lose precision float f2 {static_cast<double>(std::numeric_limits<float>::max()) + 1.0}; // no warning/ error float f3 {3.5e38}; // error: narrowing conversion of '3.5e+38' from 'double' to 'float' inside { } [-Wnarrowing] It is great that the compiler does actual range checks, but is that sufficient?