@@ -1033,6 +1033,13 @@ csqrt 0x1p-16494 0x1p+16383
csqrt 0x1.0000000000000000000000000001p-16382 0x1.0000000000000000000000000001p-16382
csqrt -0x1.0000000000000000000000000001p-16382 -0x1.0000000000000000000000000001p-16382
+csqrt 0x0.ffp128 0x1.1p-61
+csqrt -0x0.ffp128 0x1.1p-61
+csqrt 0x0.ffp1024 0x1.1p-509
+csqrt -0x0.ffp1024 0x1.1p-509
+csqrt 0x0.ffp16384 0x1.1p-8189
+csqrt -0x0.ffp16384 0x1.1p-8189
+
ctan 0 0
ctan 0 -0
ctan -0 0
@@ -118,12 +118,28 @@ __csqrt (__complex__ double x)
if (__real__ x > 0)
{
r = __ieee754_sqrt (0.5 * (d + __real__ x));
- s = 0.5 * (__imag__ x / r);
+ if (scale == 1 && fabs (__imag__ x) < 1.0)
+ {
+ /* Avoid possible intermediate underflow. */
+ s = __imag__ x / r;
+ r = __scalbn (r, scale);
+ scale = 0;
+ }
+ else
+ s = 0.5 * (__imag__ x / r);
}
else
{
s = __ieee754_sqrt (0.5 * (d - __real__ x));
- r = fabs (0.5 * (__imag__ x / s));
+ if (scale == 1 && fabs (__imag__ x) < 1.0)
+ {
+ /* Avoid possible intermediate underflow. */
+ r = fabs (__imag__ x / s);
+ s = __scalbn (s, scale);
+ scale = 0;
+ }
+ else
+ r = fabs (0.5 * (__imag__ x / s));
}
if (scale)
@@ -118,12 +118,28 @@ __csqrtf (__complex__ float x)
if (__real__ x > 0)
{
r = __ieee754_sqrtf (0.5f * (d + __real__ x));
- s = 0.5f * (__imag__ x / r);
+ if (scale == 1 && fabsf (__imag__ x) < 1.0f)
+ {
+ /* Avoid possible intermediate underflow. */
+ s = __imag__ x / r;
+ r = __scalbnf (r, scale);
+ scale = 0;
+ }
+ else
+ s = 0.5f * (__imag__ x / r);
}
else
{
s = __ieee754_sqrtf (0.5f * (d - __real__ x));
- r = fabsf (0.5f * (__imag__ x / s));
+ if (scale == 1 && fabsf (__imag__ x) < 1.0f)
+ {
+ /* Avoid possible intermediate underflow. */
+ r = fabsf (__imag__ x / s);
+ s = __scalbnf (s, scale);
+ scale = 0;
+ }
+ else
+ r = fabsf (0.5f * (__imag__ x / s));
}
if (scale)
@@ -118,12 +118,28 @@ __csqrtl (__complex__ long double x)
if (__real__ x > 0)
{
r = __ieee754_sqrtl (0.5L * (d + __real__ x));
- s = 0.5L * (__imag__ x / r);
+ if (scale == 1 && fabsl (__imag__ x) < 1.0L)
+ {
+ /* Avoid possible intermediate underflow. */
+ s = __imag__ x / r;
+ r = __scalbnl (r, scale);
+ scale = 0;
+ }
+ else
+ s = 0.5L * (__imag__ x / r);
}
else
{
s = __ieee754_sqrtl (0.5L * (d - __real__ x));
- r = fabsl (0.5L * (__imag__ x / s));
+ if (scale == 1 && fabsl (__imag__ x) < 1.0L)
+ {
+ /* Avoid possible intermediate underflow. */
+ r = fabsl (__imag__ x / s);
+ s = __scalbnl (s, scale);
+ scale = 0;
+ }
+ else
+ r = fabsl (0.5L * (__imag__ x / s));
}
if (scale)
@@ -1108,6 +1108,8 @@ ildouble: 2
ldouble: 2
Function: Imaginary part of "csqrt":
+double: 1
+idouble: 1
ildouble: 2
ldouble: 2