diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-06-17 21:20:15 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-06-17 21:20:15 +0000 |
commit | 2f3184451dc9daf8c15be10f190071409d93232e (patch) | |
tree | e429ec82529e3ae1fed4f8ab4d276a9fe548b9e6 /math/s_ctanl.c | |
parent | c36213513490412941512daccf447513e442651b (diff) | |
download | glibc-2f3184451dc9daf8c15be10f190071409d93232e.tar.gz glibc-2f3184451dc9daf8c15be10f190071409d93232e.tar.xz glibc-2f3184451dc9daf8c15be10f190071409d93232e.zip |
Remove ldbl-128ibm variants of complex math functions.
sysdeps/ieee754/ldbl-128ibm has its own versions of cprojl, ctanhl and ctanl. Having its own versions, where otherwise the math/ copies are generally used for all floating-point formats, means they are liable to get out of sync and not benefit from bug fixes to the generic versions. The substantive differences (not arising from getting out of sync and slightly different fixes for the same issues) are: long double compat handling (also done in the ldbl-opt versions, so doesn't require special versions for ldbl-128ibm); handling of LDBL_EPSILON (conditionally undefined and redefined in other math/ implementations, so doesn't justify a special version), and: /* __gcc_qmul does not respect -0.0 so we need the following fixup. */ if ((__real__ res == 0.0L) && (__real__ x == 0.0L)) __real__ res = __real__ x; if ((__real__ res == 0.0L) && (__imag__ x == 0.0L)) __imag__ res = __imag__ x; But if that statement about __gcc_qmul was ever true for an old version of that libgcc function, it's not the case for any GCC version now supported to build glibc; there's explicit logic early in that function (and similarly in __gcc_qdiv) to return an appropriately signed zero if the product of the high parts is zero. So this patch adds the special LDBL_EPSILON handling to the generic functions and removes the ldbl-128ibm versions. Tested for powerpc32 (compared test-ldouble.out before and after the changes; there are slight changes to results for ctanl / ctanhl, arising from divergence of the implementations, but nothing that affects the overall nature of the issues shown by the testsuite, and in particular nothing related to signs of zero resutls). * math/s_ctanhl.c [LDBL_MANT_DIG == 106] (LDBL_EPSILON): Undefine and redefine. * math/s_ctanl.c [LDBL_MANT_DIG == 106] (LDBL_EPSILON): Undefine and redefine. * sysdeps/ieee754/ldbl-128ibm/s_cprojl.c: Remove file. * sysdeps/ieee754/ldbl-128ibm/s_ctanhl.c: Likewise. * sysdeps/ieee754/ldbl-128ibm/s_ctanl.c: Likewise.
Diffstat (limited to 'math/s_ctanl.c')
-rw-r--r-- | math/s_ctanl.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/math/s_ctanl.c b/math/s_ctanl.c index 6ad1b75af4..1f927553fd 100644 --- a/math/s_ctanl.c +++ b/math/s_ctanl.c @@ -23,6 +23,13 @@ #include <math_private.h> #include <float.h> +/* To avoid spurious underflows, use this definition to treat IBM long + double as approximating an IEEE-style format. */ +#if LDBL_MANT_DIG == 106 +# undef LDBL_EPSILON +# define LDBL_EPSILON 0x1p-106L +#endif + __complex__ long double __ctanl (__complex__ long double x) { |