Branch
Hash :
1ce8849f
Author :
Date :
2025-07-28T17:50:30
float-h: change IBM long double to match GCC 15 This is in response to the GCC developers; see <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120993>. * lib/float.c (gl_LDBL_MAX): Remove the implementation for PowerPC, as it should no longer be needed. * lib/float.in.h (LDBL_MIN_EXP, LDBL_MIN_10_EXP, LDBL_MIN) (LDBL_MAX, LDBL_EPSILON, LDBL_NORM_MAX): On PowerPC with IBM long double, simplify by using the GCC 15 values unconditionally. These are the correct values according to the GCC developers and there seems little point to disagreeing with current GCC about obsolescent arithmetic that is so problematic in practice. * tests/test-float-h.c (test_long_double): Relax tests of LDBL_MAX when !LDBL_IS_IEC_60559, as the tests would now fail on PowerPC and they were not portable in that case anyway.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
@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