This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] PPC fixes for long double
- From: Steven Munroe <munroesj at us dot ibm dot com>
- To: libc-alpha at sources dot redhat dot com, ppc64-glibc at linux dot ibm dot com
- Date: Tue, 31 Jan 2006 10:12:35 -0600
- Subject: [PATCH] PPC fixes for long double
This patch resolves the ulps failures in cprojl, ctanhl, ctanl, ceill,
floorl, and the Bessel functions (j0, j1, jn, y0, y1, yn).
The double double runtime does not propigate -0.0 correctly in some
case. So I have to add fixup code to some complex functions. Similarly
ceill, floorl needed explicite handling for the correct sign of 0.0;
Also found that the k_cosl, k_sinl, k_sincosl did not compute the index
into the __sincosl_table correcly for double double. The result is bad
values for larger radian inputs and cause the Bessel function failures.
Hacked around it by converting the high 32-bit (integer form) of the
high double to ieee extended and used the index calc from the ldbl-128
(ieee extended) version.
2006-01-30 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/ieee754/ldbl-128ibm/k_cosl.c (__kernel_cosl): Correct index
for __sincosl_table.
* sysdeps/ieee754/ldbl-128ibm/k_sincosl.c (__kernel_cosl): Correct
index for __sincosl_table.
* sysdeps/ieee754/ldbl-128ibm/k_sinl.c (__kernel_cosl): Correct index
for __sincosl_table.
* sysdeps/ieee754/ldbl-128ibm/s_ceill.c: Correct sign of 0.0.
* sysdeps/ieee754/ldbl-128ibm/s_floorl.c: Correct sign of 0.0.
* sysdeps/ieee754/ldbl-128ibm/s_cprojl.c: New file.
* sysdeps/ieee754/ldbl-128ibm/s_ctanhl.c: New file.
* sysdeps/ieee754/ldbl-128ibm/s_ctanl.c: New file.
* sysdeps/powerpc/fpu/libm-test-ulps: Update j0, j1, jn, y0, y1, yn
ulps to match the kcosl/ksinl fix.
diff -urN libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/k_cosl.c libc24/sysdeps/ieee754/ldbl-128ibm/k_cosl.c
--- libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/k_cosl.c 2006-01-27 18:07:25.000000000 -0600
+++ libc24/sysdeps/ieee754/ldbl-128ibm/k_cosl.c 2006-01-30 14:19:19.000000000 -0600
@@ -104,6 +104,24 @@
pre-computed tables, compute cosl(l) and sinl(l) using a
Chebyshev polynomial of degree 10(11) and compute
cosl(h+l) = cosl(h)cosl(l) - sinl(h)sinl(l). */
+ int six = tix;
+ tix = ((six - 0x3ff00000) >> 4) + 0x3fff0000;
+ index = 0x3ffe - (tix >> 16);
+ hix = (tix + (0x200 << index)) & (0xfffffc00 << index);
+ x = fabsl (x);
+ switch (index)
+ {
+ case 0: index = ((45 << 10) + hix - 0x3ffe0000) >> 8; break;
+ case 1: index = ((13 << 11) + hix - 0x3ffd0000) >> 9; break;
+ default:
+ case 2: index = (hix - 0x3ffc3000) >> 10; break;
+ }
+ hix = (hix << 4) & 0x3fffffff;
+/*
+ The following should work for double but generates the wrong index.
+ For now the code above converts double to ieee extended to compute
+ the index back to double for the h value.
+
index = 0x3fe - (tix >> 20);
hix = (tix + (0x200 << index)) & (0xfffffc00 << index);
x = fabsl (x);
@@ -114,7 +132,7 @@
default:
case 2: index = (hix - 0x3fc30000) >> 14; break;
}
-
+*/
SET_LDOUBLE_WORDS64(h, ((u_int64_t)hix) << 32, 0);
l = y - (h - x);
z = l * l;
diff -urN libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c libc24/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c
--- libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c 2006-01-27 18:07:25.000000000 -0600
+++ libc24/sysdeps/ieee754/ldbl-128ibm/k_sincosl.c 2006-01-30 14:19:19.000000000 -0600
@@ -131,6 +131,25 @@
Chebyshev polynomial of degree 10(11) and compute
sinl(h+l) = sinl(h)cosl(l) + cosl(h)sinl(l) and
cosl(h+l) = cosl(h)cosl(l) - sinl(h)sinl(l). */
+ int six = tix;
+ tix = ((six - 0x3ff00000) >> 4) + 0x3fff0000;
+ index = 0x3ffe - (tix >> 16);
+ hix = (tix + (0x200 << index)) & (0xfffffc00 << index);
+ x = fabsl (x);
+ switch (index)
+ {
+ case 0: index = ((45 << 10) + hix - 0x3ffe0000) >> 8; break;
+ case 1: index = ((13 << 11) + hix - 0x3ffd0000) >> 9; break;
+ default:
+ case 2: index = (hix - 0x3ffc3000) >> 10; break;
+ }
+ hix = (hix << 4) & 0x3fffffff;
+/*
+ The following should work for double but generates the wrong index.
+ For now the code above converts double to ieee extended to compute
+ the index back to double for the h value.
+
+
index = 0x3fe - (tix >> 20);
hix = (tix + (0x2000 << index)) & (0xffffc000 << index);
x = fabsl (x);
@@ -141,7 +160,7 @@
default:
case 2: index = (hix - 0x3fc30000) >> 14; break;
}
-
+*/
SET_LDOUBLE_WORDS64(h, ((u_int64_t)hix) << 32, 0);
if (iy)
l = y - (h - x);
diff -urN libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/k_sinl.c libc24/sysdeps/ieee754/ldbl-128ibm/k_sinl.c
--- libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/k_sinl.c 2006-01-27 18:07:25.000000000 -0600
+++ libc24/sysdeps/ieee754/ldbl-128ibm/k_sinl.c 2006-01-30 14:19:19.000000000 -0600
@@ -104,6 +104,24 @@
pre-computed tables, compute cosl(l) and sinl(l) using a
Chebyshev polynomial of degree 10(11) and compute
sinl(h+l) = sinl(h)cosl(l) + cosl(h)sinl(l). */
+ int six = tix;
+ tix = ((six - 0x3ff00000) >> 4) + 0x3fff0000;
+ index = 0x3ffe - (tix >> 16);
+ hix = (tix + (0x200 << index)) & (0xfffffc00 << index);
+ x = fabsl (x);
+ switch (index)
+ {
+ case 0: index = ((45 << 10) + hix - 0x3ffe0000) >> 8; break;
+ case 1: index = ((13 << 11) + hix - 0x3ffd0000) >> 9; break;
+ default:
+ case 2: index = (hix - 0x3ffc3000) >> 10; break;
+ }
+ hix = (hix << 4) & 0x3fffffff;
+/*
+ The following should work for double but generates the wrong index.
+ For now the code above converts double to ieee extended to compute
+ the index back to double for the h value.
+
index = 0x3fe - (tix >> 20);
hix = (tix + (0x2000 << index)) & (0xffffc000 << index);
x = fabsl (x);
@@ -114,7 +132,7 @@
default:
case 2: index = (hix - 0x3fc30000) >> 14; break;
}
-
+*/
SET_LDOUBLE_WORDS64(h, ((u_int64_t)hix) << 32, 0);
if (iy)
l = y - (h - x);
diff -urN libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_ceill.c libc24/sysdeps/ieee754/ldbl-128ibm/s_ceill.c
--- libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_ceill.c 2006-01-27 18:07:25.000000000 -0600
+++ libc24/sysdeps/ieee754/ldbl-128ibm/s_ceill.c 2006-01-30 18:01:43.000000000 -0600
@@ -44,19 +44,23 @@
u.d = x;
if (fabs (u.dd[0]) < TWO52)
- {
+ {
+ double high = u.dd[0];
fesetround(FE_UPWARD);
- if (u.dd[0] > 0.0)
+ if (high > 0.0)
{
- u.dd[0] += TWO52;
- u.dd[0] -= TWO52;
+ high += TWO52;
+ high -= TWO52;
+ if (high == -0.0) high = 0.0;
}
- else if (u.dd[0] < 0.0)
+ else if (high < 0.0)
{
- u.dd[0] -= TWO52;
- u.dd[0] += TWO52;
+ high -= TWO52;
+ high += TWO52;
+ if (high == 0.0) high = -0.0;
}
- u.dd[1] = 0.0;
+ u.dd[0] = high;
+ u.dd[1] = 0.0;
fesetround(mode);
}
else if (fabs (u.dd[1]) < TWO52 && u.dd[1] != 0.0)
diff -urN libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c
--- libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c Wed Dec 31 18:00:00 1969
+++ libc24/sysdeps/ieee754/ldbl-128ibm/s_cprojl.c Mon Jan 30 14:19:19 2006
@@ -0,0 +1,54 @@
+/* Compute projection of complex long double value to Riemann sphere.
+ Copyright (C) 1997, 1999, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <complex.h>
+#include <math.h>
+#include <math_ldbl_opt.h>
+
+__complex__ long double
+__cprojl (__complex__ long double x)
+{
+ __complex__ long double res;
+
+ if (isnan (__real__ x) && isnan (__imag__ x))
+ return x;
+ else if (!isfinite (__real__ x) || !isfinite (__imag__ x))
+ {
+ __real__ res = INFINITY;
+ __imag__ res = __copysignl (0.0, __imag__ x);
+ }
+ else
+ {
+ long double den = (__real__ x * __real__ x + __imag__ x * __imag__ x
+ + 1.0);
+
+ __real__ res = (2.0 * __real__ x) / den;
+ __imag__ res = (2.0 * __imag__ x) / den;
+ /* __gcc_qmul does not respect -0.0 so we need the following fixup. */
+ if (__real__ x == 0.0)
+ __real__ res = __real__ x;
+
+ if (__imag__ x == 0.0)
+ __imag__ res = __imag__ x;
+ }
+
+ return res;
+}
+long_double_symbol (libm, __cprojl, cprojl);
diff -urN libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_ctanhl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_ctanhl.c
--- libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_ctanhl.c Wed Dec 31 18:00:00 1969
+++ libc24/sysdeps/ieee754/ldbl-128ibm/s_ctanhl.c Mon Jan 30 14:19:19 2006
@@ -0,0 +1,87 @@
+/* Complex hyperbole tangent for long double.
+ Copyright (C) 1997, 2005, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <complex.h>
+#include <fenv.h>
+#include <math.h>
+#include <math_ldbl_opt.h>
+
+#include "math_private.h"
+
+
+__complex__ long double
+__ctanhl (__complex__ long double x)
+{
+ __complex__ long double res;
+
+ if (!isfinite (__real__ x) || !isfinite (__imag__ x))
+ {
+ if (__isinfl (__real__ x))
+ {
+ __real__ res = __copysignl (1.0, __real__ x);
+ __imag__ res = __copysignl (0.0, __imag__ x);
+ }
+ else if (__imag__ x == 0.0)
+ {
+ res = x;
+ }
+ else
+ {
+ __real__ res = __nanl ("");
+ __imag__ res = __nanl ("");
+
+#ifdef FE_INVALID
+ if (__isinfl (__imag__ x))
+ feraiseexcept (FE_INVALID);
+#endif
+ }
+ }
+ else
+ {
+ long double sin2ix, cos2ix;
+ long double den;
+
+ __sincosl (2.0 * __imag__ x, &sin2ix, &cos2ix);
+
+ den = (__ieee754_coshl (2.0 * __real__ x) + cos2ix);
+
+ if (den == 0.0L)
+ {
+ __complex__ long double ez = __cexpl (x);
+ __complex__ long double emz = __cexpl (-x);
+
+ res = (ez - emz) / (ez + emz);
+ }
+ else
+ {
+ __real__ res = __ieee754_sinhl (2.0 * __real__ x) / den;
+ __imag__ res = sin2ix / den;
+ }
+ /* __gcc_qmul does not respect -0.0 so we need the following fixup. */
+ if ((__real__ res == 0.0) && (__real__ x == 0.0))
+ __real__ res = __real__ x;
+
+ if ((__real__ res == 0.0) && (__imag__ x == 0.0))
+ __imag__ res = __imag__ x;
+ }
+
+ return res;
+}
+long_double_symbol (libm, __ctanhl, ctanhl);
diff -urN libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_ctanl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_ctanl.c
--- libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_ctanl.c Wed Dec 31 18:00:00 1969
+++ libc24/sysdeps/ieee754/ldbl-128ibm/s_ctanl.c Mon Jan 30 14:19:19 2006
@@ -0,0 +1,88 @@
+/* Complex tangent function for long double.
+ Copyright (C) 1997, 2005, 2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <complex.h>
+#include <fenv.h>
+#include <math.h>
+#include <math_ldbl_opt.h>
+
+#include "math_private.h"
+
+
+__complex__ long double
+__ctanl (__complex__ long double x)
+{
+ __complex__ long double res;
+
+ if (!isfinite (__real__ x) || !isfinite (__imag__ x))
+ {
+ if (__isinfl (__imag__ x))
+ {
+ __real__ res = __copysignl (0.0, __real__ x);
+ __imag__ res = __copysignl (1.0, __imag__ x);
+ }
+ else if (__real__ x == 0.0)
+ {
+ res = x;
+ }
+ else
+ {
+ __real__ res = __nanl ("");
+ __imag__ res = __nanl ("");
+
+#ifdef FE_INVALID
+ if (__isinfl (__real__ x))
+ feraiseexcept (FE_INVALID);
+#endif
+ }
+ }
+ else
+ {
+ long double sin2rx, cos2rx;
+ long double den;
+
+ __sincosl (2.0 * __real__ x, &sin2rx, &cos2rx);
+
+ den = cos2rx + __ieee754_coshl (2.0 * __imag__ x);
+
+
+ if (den == 0.0)
+ {
+ __complex__ long double ez = __cexpl (1.0i * x);
+ __complex__ long double emz = __cexpl (-1.0i * x);
+
+ res = (ez - emz) / (ez + emz) * -1.0i;
+ }
+ else
+ {
+ __real__ res = sin2rx / den;
+ __imag__ res = __ieee754_sinhl (2.0 * __imag__ x) / den;
+ }
+ /* __gcc_qmul does not respect -0.0 so we need the following fixup. */
+ if ((__real__ res == 0.0) && (__real__ x == 0.0))
+ __real__ res = __real__ x;
+
+ if ((__real__ res == 0.0) && (__imag__ x == 0.0))
+ __imag__ res = __imag__ x;
+ }
+
+ return res;
+}
+long_double_symbol (libm, __ctanl, ctanl);
diff -urN libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_floorl.c libc24/sysdeps/ieee754/ldbl-128ibm/s_floorl.c
--- libc24-cvstip-20060130b/sysdeps/ieee754/ldbl-128ibm/s_floorl.c 2006-01-27 18:07:25.000000000 -0600
+++ libc24/sysdeps/ieee754/ldbl-128ibm/s_floorl.c 2006-01-30 18:03:06.000000000 -0600
@@ -44,18 +44,22 @@
u.d = x;
if (fabs (u.dd[0]) < TWO52)
- {
+ {
+ double high = u.dd[0];
fesetround(FE_DOWNWARD);
- if (u.dd[0] > 0.0)
+ if (high > 0.0)
{
- u.dd[0] += TWO52;
- u.dd[0] -= TWO52;
+ high += TWO52;
+ high -= TWO52;
+ if (high == -0.0) high = 0.0;
}
- else if (u.dd[0] < 0.0)
+ else if (high < 0.0)
{
- u.dd[0] -= TWO52;
- u.dd[0] += TWO52;
+ high -= TWO52;
+ high += TWO52;
+ if (high == 0.0) high = -0.0;
}
+ u.dd[0] = high;
u.dd[1] = 0.0;
fesetround(mode);
}
diff -urN libc24-cvstip-20060130b/sysdeps/powerpc/fpu/libm-test-ulps libc24/sysdeps/powerpc/fpu/libm-test-ulps
--- libc24-cvstip-20060130b/sysdeps/powerpc/fpu/libm-test-ulps 2006-01-30 16:29:27.000000000 -0600
+++ libc24/sysdeps/powerpc/fpu/libm-test-ulps 2006-01-30 18:22:09.562194992 -0600
@@ -37,16 +37,9 @@
ldouble: 1
# cacosh
-Test "Real part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
-double: 1
-float: 7
-idouble: 1
-ifloat: 7
Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i":
-double: 1
-float: 3
-idouble: 1
-ifloat: 3
+float: 1
+ifloat: 1
# casin
Test "Real part of: casin (-2 - 3 i) == -0.57065278432109940071028387968566963 - 1.9833870299165354323470769028940395 i":
@@ -84,8 +77,6 @@
# catan
Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i":
-float: 3
-ifloat: 3
ildouble: 1
ldouble: 1
Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i":
@@ -93,23 +84,14 @@
float: 1
idouble: 1
ifloat: 1
-Test "Real part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i":
-float: 4
-ifloat: 4
# catanh
Test "Real part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i":
double: 4
idouble: 4
-Test "Imaginary part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i":
-float: 4
-ifloat: 4
Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i":
double: 1
idouble: 1
-Test "Imaginary part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i":
-float: 6
-ifloat: 6
# cbrt
Test "cbrt (-27.0) == -3.0":
@@ -167,8 +149,6 @@
# clog
Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680267437207826593 - 2.1587989303424641704769327722648368 i":
-float: 3
-ifloat: 3
ildouble: 1
ldouble: 1
Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i":
@@ -197,9 +177,7 @@
ldouble: 1
Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i":
double: 1
-float: 5
idouble: 1
-ifloat: 5
ildouble: 1
ldouble: 1
Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
@@ -298,19 +276,15 @@
# cos
Test "cos (M_PI_6l * 2.0) == 0.5":
double: 1
-float: 1
idouble: 1
-ifloat: 1
Test "cos (M_PI_6l * 4.0) == -0.5":
double: 2
float: 1
idouble: 2
ifloat: 1
-Test "cos (pi/2) == 0":
-double: 1
-float: 1
-idouble: 1
-ifloat: 1
+Test "cos (16.0) == -0.9576594803233846418996372326511034717803"
+ildouble: 2
+ldouble: 2
# cpow
Test "Real part of: cpow (0.75 + 1.25 i, 0.0 + 1.0 i) == 0.331825439177608832276067945276730566 + 0.131338600281188544930936345230903032 i":
@@ -381,9 +355,6 @@
ifloat: 1
# ctan
-Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
-double: 1
-idouble: 1
Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i":
ildouble: 1
ldouble: 1
@@ -446,10 +417,10 @@
ildouble: 1
ldouble: 1
Test "exp10 (3) == 1000":
-double: 6
float: 2
-idouble: 6
ifloat: 2
+double: 6
+idouble: 6
ildouble: 8
ldouble: 8
@@ -500,68 +471,92 @@
# j0
Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1":
double: 1
-float: 2
+float: 1
idouble: 1
-ifloat: 2
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "j0 (10.0) == -0.245935764451348335197760862485328754":
-double: 3
+double: 2
float: 1
-idouble: 3
+idouble: 2
ifloat: 1
+ildouble: 1
+ldouble: 1
Test "j0 (2.0) == 0.223890779141235668051827454649948626":
float: 2
ifloat: 2
Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1":
double: 1
-float: 2
+float: 1
idouble: 1
-ifloat: 2
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "j0 (8.0) == 0.171650807137553906090869407851972001":
float: 1
ifloat: 1
+ildouble: 1
+ldouble: 1
# j1
Test "j1 (10.0) == 0.0434727461688614366697487680258592883":
float: 2
ifloat: 2
+ildouble: 1
+ldouble: 1
Test "j1 (2.0) == 0.576724807756873387202448242269137087":
double: 1
idouble: 1
Test "j1 (8.0) == 0.234636346853914624381276651590454612":
double: 1
idouble: 1
+ildouble: 1
+ldouble: 1
# jn
Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1":
double: 1
-float: 2
+float: 1
idouble: 1
-ifloat: 2
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "jn (0, 10.0) == -0.245935764451348335197760862485328754":
-double: 3
+double: 2
float: 1
-idouble: 3
+idouble: 2
ifloat: 1
+ildouble: 1
+ldouble: 1
Test "jn (0, 2.0) == 0.223890779141235668051827454649948626":
float: 2
ifloat: 2
Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1":
double: 1
-float: 2
+float: 1
idouble: 1
-ifloat: 2
+ifloat: 1
+ildouble: 1
+ldouble: 1
Test "jn (0, 8.0) == 0.171650807137553906090869407851972001":
float: 1
ifloat: 1
+ildouble: 1
+ldouble: 1
Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883":
float: 2
ifloat: 2
+ildouble: 1
+ldouble: 1
Test "jn (1, 2.0) == 0.576724807756873387202448242269137087":
double: 1
idouble: 1
Test "jn (1, 8.0) == 0.234636346853914624381276651590454612":
double: 1
idouble: 1
+ildouble: 1
+ldouble: 1
Test "jn (10, -1.0) == 0.263061512368745320699785368779050294e-9":
ildouble: 1
ldouble: 1
@@ -583,6 +578,8 @@
Test "jn (10, 10.0) == 0.207486106633358857697278723518753428":
float: 1
ifloat: 1
+ildouble: 4
+ldouble: 4
Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6":
float: 4
ifloat: 4
@@ -602,9 +599,11 @@
ldouble: 1
Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563":
double: 3
-float: 2
+float: 1
idouble: 3
-ifloat: 2
+ifloat: 1
+ildouble: 2
+ldouble: 2
Test "jn (3, 2.0) == 0.128943249474402051098793332969239835":
double: 1
float: 2
@@ -647,22 +646,20 @@
ildouble: 1
ldouble: 1
+# sin
+Test "sin (16.0) == -0.2879033166650652947844562482186175296207"
+ildouble: 2
+ldouble: 2
+
# sincos
Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
double: 1
-float: 1
idouble: 1
-ifloat: 1
Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res":
double: 1
float: 1
idouble: 1
ifloat: 1
-Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res":
-double: 1
-float: 1
-idouble: 1
-ifloat: 1
Test "sincos (pi/6, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in cos_res":
float: 1
ifloat: 1
@@ -674,8 +671,6 @@
# tan
Test "tan (pi/4) == 1":
-double: 1
-idouble: 1
ildouble: 1
ldouble: 1
@@ -718,19 +713,23 @@
float: 1
idouble: 2
ifloat: 1
-Test "y0 (10.0) == 0.0556711672835993914244598774101900481":
+Test "y0 (2.0) == 0.510375672649745119596606592727157873":
double: 1
-float: 1
idouble: 1
+Test "y0 (10.0) == 0.0556711672835993914244598774101900481":
+float: 1
ifloat: 1
-Test "y0 (2.0) == 0.510375672649745119596606592727157873":
-double: 1
idouble: 1
+double: 1
+ildouble: 1
+ldouble: 1
Test "y0 (8.0) == 0.223521489387566220527323400498620359":
double: 1
float: 1
idouble: 1
ifloat: 1
+ildouble: 1
+ldouble: 1
# y1
Test "y1 (0.125) == -5.19993611253477499595928744876579921":
@@ -744,16 +743,20 @@
float: 1
idouble: 3
ifloat: 1
+ildouble: 2
+ldouble: 2
Test "y1 (2.0) == -0.107032431540937546888370772277476637":
double: 1
float: 1
-idouble: 1
-ifloat: 1
+idouble: 2
+ifloat: 2
Test "y1 (8.0) == -0.158060461731247494255555266187483550":
double: 1
float: 2
idouble: 1
ifloat: 2
+ildouble: 2
+ldouble: 2
# yn
Test "yn (0, 0.75) == -0.137172769385772397522814379396581855":
@@ -764,37 +767,43 @@
float: 1
idouble: 2
ifloat: 1
-ildouble: 1
-ldouble: 1
+ildouble: 2
+ldouble: 2
Test "yn (0, 1.5) == 0.382448923797758843955068554978089862":
double: 2
float: 1
idouble: 2
ifloat: 1
-Test "yn (0, 10.0) == 0.0556711672835993914244598774101900481":
+Test "yn (0, 2.0) == 0.510375672649745119596606592727157873":
double: 1
-float: 1
idouble: 1
+Test "yn (0, 10.0) == 0.0556711672835993914244598774101900481":
+float: 1
ifloat: 1
-Test "yn (0, 2.0) == 0.510375672649745119596606592727157873":
-double: 1
idouble: 1
+double: 1
+ildouble: 2
+ldouble: 2
Test "yn (0, 8.0) == 0.223521489387566220527323400498620359":
double: 1
float: 1
idouble: 1
ifloat: 1
+ildouble: 2
+ldouble: 2
Test "yn (1, 0.125) == -5.19993611253477499595928744876579921":
double: 1
idouble: 1
Test "yn (1, 1.5) == -0.412308626973911295952829820633445323":
-float: 2
-ifloat: 2
+float: 1
+ifloat: 1
Test "yn (1, 10.0) == 0.249015424206953883923283474663222803":
double: 3
float: 1
idouble: 3
ifloat: 1
+ildouble: 2
+ldouble: 2
Test "yn (1, 2.0) == -0.107032431540937546888370772277476637":
double: 1
float: 1
@@ -805,9 +814,8 @@
float: 2
idouble: 1
ifloat: 2
-Test "yn (3, 0.125) == -2612.69757350066712600220955744091741":
-double: 1
-idouble: 1
+ildouble: 2
+ldouble: 2
Test "yn (10, 0.125) == -127057845771019398.252538486899753195":
double: 1
idouble: 1
@@ -821,16 +829,16 @@
ifloat: 2
Test "yn (10, 10.0) == -0.359814152183402722051986577343560609":
double: 2
-float: 2
idouble: 2
-ifloat: 2
+ildouble: 2
+ldouble: 2
Test "yn (10, 2.0) == -129184.542208039282635913145923304214":
-double: 3
float: 1
-idouble: 3
ifloat: 1
-ildouble: 1
-ldouble: 1
+double: 3
+idouble: 3
+ldouble: 2
+ildouble: 2
Test "yn (3, 0.125) == -2612.69757350066712600220955744091741":
double: 1
idouble: 1
@@ -842,6 +850,8 @@
float: 1
idouble: 1
ifloat: 1
+ildouble: 2
+ldouble: 2
Test "yn (3, 2.0) == -1.12778377684042778608158395773179238":
double: 1
idouble: 1
@@ -886,18 +896,12 @@
ldouble: 1
Function: Real part of "cacosh":
-double: 1
-float: 7
-idouble: 1
-ifloat: 7
ildouble: 1
ldouble: 1
Function: Imaginary part of "cacosh":
-double: 1
-float: 3
-idouble: 1
-ifloat: 3
+float: 1
+ifloat: 1
Function: Real part of "casin":
double: 1
@@ -928,8 +932,6 @@
ldouble: 1
Function: Real part of "catan":
-float: 4
-ifloat: 4
ildouble: 1
ldouble: 1
@@ -945,10 +947,6 @@
double: 4
idouble: 4
-Function: Imaginary part of "catanh":
-float: 6
-ifloat: 6
-
Function: "cbrt":
double: 1
idouble: 1
@@ -1002,8 +1000,6 @@
ldouble: 2
Function: Imaginary part of "clog":
-float: 3
-ifloat: 3
ildouble: 1
ldouble: 1
@@ -1015,9 +1011,9 @@
Function: Imaginary part of "clog10":
double: 1
-float: 5
+float: 1
idouble: 1
-ifloat: 5
+ifloat: 1
ildouble: 1
ldouble: 1
@@ -1082,8 +1078,6 @@
ldouble: 1
Function: Real part of "ctan":
-double: 1
-idouble: 1
ildouble: 1
ldouble: 1
@@ -1130,8 +1124,8 @@
float: 2
idouble: 6
ifloat: 2
-ildouble: 8
-ldouble: 8
+ildouble: 1
+ldouble: 1
Function: "exp2":
ildouble: 2
@@ -1154,22 +1148,28 @@
ldouble: 1
Function: "j0":
-double: 3
+double: 2
float: 2
-idouble: 3
+idouble: 2
ifloat: 2
+ildouble: 1
+ldouble: 1
Function: "j1":
double: 1
float: 2
idouble: 1
ifloat: 2
+ildouble: 1
+ldouble: 1
Function: "jn":
double: 3
float: 4
idouble: 3
ifloat: 4
+ildouble: 4
+ldouble: 4
Function: "lgamma":
double: 1
@@ -1244,17 +1244,23 @@
float: 1
idouble: 2
ifloat: 1
+ildouble: 1
+ldouble: 1
Function: "y1":
double: 3
float: 2
idouble: 3
ifloat: 2
+ildouble: 2
+ldouble: 2
Function: "yn":
double: 3
float: 2
idouble: 3
ifloat: 2
+ildouble: 2
+ldouble: 2
# end of automatic generation