#include <math.h>
#include "libgfortran.h"
GFC_REAL_4
cabsf (GFC_COMPLEX_4 z)
{
return hypotf (REALPART (z), IMAGPART (z));
}
GFC_REAL_4
cargf (GFC_COMPLEX_4 z)
{
GFC_REAL_4 arg;
return atan2f (IMAGPART (z), REALPART (z));
}
GFC_COMPLEX_4
cexpf (GFC_COMPLEX_4 z)
{
GFC_REAL_4 a;
GFC_REAL_4 b;
GFC_COMPLEX_4 v;
a = REALPART (z);
b = IMAGPART (z);
COMPLEX_ASSIGN (v, cosf (b), sinf (b));
return expf (a) * v;
}
GFC_COMPLEX_4
clogf (GFC_COMPLEX_4 z)
{
GFC_COMPLEX_4 v;
COMPLEX_ASSIGN (v, logf (cabsf (z)), cargf (z));
return v;
}
GFC_COMPLEX_4
clog10f (GFC_COMPLEX_4 z)
{
GFC_COMPLEX_4 v;
COMPLEX_ASSIGN (v, log10f (cabsf (z)), cargf (z));
return v;
}
GFC_COMPLEX_4
cpowf (GFC_COMPLEX_4 base, GFC_COMPLEX_4 power)
{
return cexpf (power * clogf (base));
}
GFC_COMPLEX_4
csqrtf (GFC_COMPLEX_4 z)
{
GFC_REAL_4 re;
GFC_REAL_4 im;
GFC_COMPLEX_4 v;
re = REALPART (z);
im = IMAGPART (z);
if (im == 0.0)
{
if (re < 0.0)
{
COMPLEX_ASSIGN (v, 0.0, copysignf (sqrtf (-re), im));
}
else
{
COMPLEX_ASSIGN (v, fabsf (sqrt (re)),
copysignf (0.0, im));
}
}
else if (re == 0.0)
{
GFC_REAL_4 r;
r = sqrtf (0.5 * fabs (im));
COMPLEX_ASSIGN (v, copysignf (r, im), r);
}
else
{
GFC_REAL_4 d, r, s;
d = hypotf (re, im);
if (re > 0)
{
r = sqrtf (0.5 * d + 0.5 * re);
s = (0.5 * im) / r;
}
else
{
s = sqrtf (0.5 * d - 0.5 * re);
r = fabsf ((0.5 * im) / s);
}
COMPLEX_ASSIGN (v, r, copysignf (s, im));
}
return v;
}