From 6.3.1.5 of the C99 standard:
If a
doubleis demoted to afloator along doubleis demoted to adoubleor afloat, ...and the value being converted is outside the range of values that can be represented, the behavior is undefined.
This non-compliant code illustrates possible undefined behavior associated with demoting floating point represented numbers.
long double ld; double d1; double d2; float f1; float f2; ... f1 = (float)d1; f2 = (float)ld; d2 = (double)ld; |
In the assignments above, it is possible that the variable d1 is outside the range of values that can be represented by a float or that the variable ld is outside the range of values that can be represented as either a float or a double.
This compliant code properly checks to see whether the values to be stored are too large to be represented.
#include <float.h>
...
long double ld;
double d1;
double d2;
float f1;
float f2;
...
if(d1 > FLT_MAX || d1 < -FLT_MAX) {
/* Handle error condition */
} else {
f1 = (float)d1;
}
if(ld > FLT_MAX || ld < -FLT_MAX) {
/* Handle error condition */
} else {
f2 = (float)ld;
}
if(ld > DBL_MAX || ld > -DBL_MAX) {
/* Handle error condition */
} else {
d2 = (double)ld;
}
|
\[[ISO/IEC 9899-1999:TC2|AA. C References#ISO/IEC 9899-1999TC2]\] Section 6.3.1.5, "Real floating types" |