X-Git-Url: http://nsz.repo.hu/git/?p=libm;a=blobdiff_plain;f=src%2Fcmath%2Fcpow.c;h=f863588fe7881dc9eeda32c620d2cc3cad889757;hp=0bc36d3cd986282c0dd3f993124df4dd50ae3eae;hb=5718e964d8a5c273a91b4d86d16926f54151c58f;hpb=1305df184d9d04274ce170864c92af8cbeae23e2 diff --git a/src/cmath/cpow.c b/src/cmath/cpow.c index 0bc36d3..f863588 100644 --- a/src/cmath/cpow.c +++ b/src/cmath/cpow.c @@ -1,61 +1,8 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/s_cpow.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -/* - * Complex power function - * - * - * SYNOPSIS: - * - * double complex cpow(); - * double complex a, z, w; - * - * w = cpow (a, z); - * - * - * DESCRIPTION: - * - * Raises complex A to the complex Zth power. - * Definition is per AMS55 # 4.2.8, - * analytically equivalent to cpow(a,z) = cexp(z clog(a)). - * - * ACCURACY: - * - * Relative error: - * arithmetic domain # trials peak rms - * IEEE -10,+10 30000 9.4e-15 1.5e-15 - */ - #include "libm.h" -double complex cpow(double complex a, double complex z) -{ - double x, y, r, theta, absa, arga; +/* pow(z, c) = exp(c log(z)), See C99 G.6.4.1 */ - x = creal(z); - y = cimag(z); - absa = cabs(a); - if (absa == 0.0) - return 0.0; - arga = carg(a); - r = pow(absa, x); - theta = x * arga; - if (y != 0.0) { - r = r * exp(-y * arga); - theta += y * log(absa); - } - return cpack(r * cos(theta), (r * sin(theta))); +double complex cpow(double complex z, double complex c) +{ + return cexp(c * clog(z)); }