+2011-12-21 Ulrich Drepper <drepper@gmail.com>
+
+ * math/s_cacosh.c: Use Kahan's formula if the subtraction could lead
+ to large cancellation.
+ * math/s_cacoshf.c: Likewise.
+ * math/s_cacoshl.c: Likewise.
+
2011-11-18 Richard B. Kreckel <kreckel@ginac.de>
[BZ #13305]
__real__ res = 0.0;
__imag__ res = __copysign (M_PI_2, __imag__ x);
}
+ /* The factor 16 is just a guess. */
+ else if (16.0 * fabs (__imag__ x) < fabs (__real__ x))
+ /* Kahan's formula which avoid cancellation through subtraction in
+ some cases. */
+ res = 2.0 * __clog (__csqrt ((x + 1.0) / 2.0) + __csqrt ((x - 1.0) / 2.0));
else
{
__complex__ double y;
__real__ res = 0.0;
__imag__ res = __copysignf (M_PI_2, __imag__ x);
}
+ /* The factor 16 is just a guess. */
+ else if (16.0 * fabsf (__imag__ x) < fabsf (__real__ x))
+ /* Kahan's formula which avoid cancellation through subtraction in
+ some cases. */
+ res = 2.0 * __clogf (__csqrtf ((x + 1.0) / 2.0)
+ + __csqrtf ((x - 1.0) / 2.0));
else
{
__complex__ float y;
__real__ res = 0.0;
__imag__ res = __copysignl (M_PI_2l, __imag__ x);
}
+ /* The factor 16 is just a guess. */
+ else if (16.0L * fabsl (__imag__ x) < fabsl (__real__ x))
+ /* Kahan's formula which avoid cancellation through subtraction in
+ some cases. */
+ res = 2.0L * __clogl (__csqrtl ((x + 1.0L) / 2.0L)
+ + __csqrtl ((x - 1.0L) / 2.0L));
else
{
__complex__ long double y;