* SUCH DAMAGE.
*/
-#include "libm.h"
+#include "complex_impl.h"
/*
* gcc doesn't implement complex multiplication or division correctly,
/* Handle special cases. */
if (z == 0)
- return cpack(0, b);
+ return CMPLX(0, b);
if (isinf(b))
- return cpack(INFINITY, b);
+ return CMPLX(INFINITY, b);
if (isnan(a)) {
t = (b - b) / (b - b); /* raise invalid if b is not a NaN */
- return cpack(a, t); /* return NaN + NaN i */
+ return CMPLX(a, t); /* return NaN + NaN i */
}
if (isinf(a)) {
/*
* csqrt(-inf + y i) = 0 + inf i
*/
if (signbit(a))
- return cpack(fabs(b - b), copysign(a, b));
+ return CMPLX(fabs(b - b), copysign(a, b));
else
- return cpack(a, copysign(b - b, b));
+ return CMPLX(a, copysign(b - b, b));
}
/*
* The remaining special case (b is NaN) is handled just fine by
/* Algorithm 312, CACM vol 10, Oct 1967. */
if (a >= 0) {
t = sqrt((a + hypot(a, b)) * 0.5);
- result = cpack(t, b / (2 * t));
+ result = CMPLX(t, b / (2 * t));
} else {
t = sqrt((-a + hypot(a, b)) * 0.5);
- result = cpack(fabs(b) / (2 * t), copysign(t, b));
+ result = CMPLX(fabs(b) / (2 * t), copysign(t, b));
}
/* Rescale. */