/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
/*  cpowf.c */
/*
   Contributed by Danny Smith
   2004-12-24
*/

/* cpow(X, Y) = cexp(X * clog(Y)) */

#include <math.h>
#include <complex.h>

float complex cpowf (float complex X, float complex Y)
{
  float complex Res;
  float i;
  float r = _hypot (__real__ X, __imag__ X);
  if (r == 0.0f)
    {
       __real__ Res = __imag__ Res = 0.0;
    }
  else
    {
      float rho;
      float theta;
      i = cargf (X);
      theta = i * __real__ Y;
 
      if (__imag__ Y == 0.0f)
	/* This gives slightly more accurate results in these cases. */
   	rho = powf (r, __real__ Y);
      else
	{
          r = logf (r);
	  /* rearrangement of cexp(X * clog(Y)) */
	  theta += r * __imag__ Y;
	  rho = expf (r * __real__ Y - i * __imag__ Y);
	}

      __real__ Res = rho * cosf (theta);
      __imag__ Res = rho * sinf (theta);
    }
  return  Res;
}
