| @node float.h | |
| @section @file{float.h} | |
| POSIX specification:@* @url{https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/float.h.html} | |
| Gnulib module: float-h | |
| @mindex float-h | |
| Portability problems fixed by Gnulib: | |
| @itemize | |
| @item | |
| The conversion from @code{int} to @code{long double} in incorrect on some | |
| platforms: | |
| glibc 2.7 on Linux/SPARC64. | |
| @item | |
| The values of @code{LDBL_*} macros are incorrect on some platforms: | |
| On OpenBSD 4.0 and MirBSD 10, they are the same as the values of the | |
| @code{DBL_*} macros, although @samp{long double} is a larger type than | |
| @samp{double}. | |
| On FreeBSD/x86 6.4, they represent the incorrect 53-bit precision assumptions | |
| in the compiler, not the real 64-bit precision at runtime. | |
| On PowerPC with gcc 8.3 and the default @option{-mabi=ibmlongdouble}, | |
| they don't reflect the ``double double'' representation of @code{long double} | |
| correctly; the non-IEEE representation is tricky, as it is a pair of | |
| IEEE @code{double} values such that adding the two elements and | |
| rounding to even yields the high element of the pair, and arithmetic | |
| overflow has undefined behavior instead of reliably yielding infinity. | |
| @item | |
| The macros | |
| @code{FLT_HAS_SUBNORM}, @code{FLT_DECIMAL_DIG}, @code{FLT_TRUE_MIN}, | |
| @code{DBL_HAS_SUBNORM}, @code{DBL_DECIMAL_DIG}, @code{DBL_TRUE_MIN}, | |
| @code{LDBL_HAS_SUBNORM}, @code{LDBL_DECIMAL_DIG}, @code{LDBL_TRUE_MIN}, | |
| that were added in ISO C 11, are missing on some platforms: | |
| gcc 4.5.4, clang 7, Solaris 11.3 with Sun C. | |
| @item | |
| The macro @code{LDBL_DECIMAL_DIG} is missing on some platforms: | |
| MSVC 14. | |
| @item | |
| The value of macro @code{FLT_TRUE_MIN} is not a @code{float} on some platforms: | |
| AIX 7.1 with xlc. | |
| @item | |
| The macros | |
| @code{FLT_IS_IEC_60559}, @code{FLT_NORM_MAX}, @code{FLT_SNAN}, | |
| @code{DBL_IS_IEC_60559}, @code{DBL_NORM_MAX}, @code{DBL_SNAN}, | |
| @code{LDBL_IS_IEC_60559}, @code{LDBL_NORM_MAX}, @code{LDBL_SNAN}, | |
| that were added in ISO C 23, are missing on some platforms: | |
| gcc 14 without @code{-std=c23} or @code{-std=gnu23}, clang 18, musl libc 1.2.5, AIX 7.3 with xlclang, Solaris 11.3 with Sun C, MSVC 14. | |
| @end itemize | |
| Portability problems not fixed by Gnulib: | |
| @itemize | |
| @item | |
| The macro @code{FLT_ROUNDS} is a constant expression and does not represent | |
| the current rounding mode on some platforms: | |
| glibc 2.11, HP-UX 11, mingw. | |
| @item | |
| The value of @code{FLT_TRUE_MIN} is not a constant on some platforms: | |
| FreeBSD/x86. | |
| @item | |
| The values of @code{FLT_SNAN}, @code{DBL_SNAN}, @code{LDBL_SNAN} are not | |
| constants on some platforms: | |
| AIX 7.3 with xlclang, and all platforms which use the gnulib replacements. | |
| @end itemize |