Esempio n. 1
0
fcomplex
cexpf(fcomplex z) {
	fcomplex	ans;
	float		x, y, c, s;
	double		t;
	int		n, ix, iy, hx, hy;

	x = F_RE(z);
	y = F_IM(z);
	hx = THE_WORD(x);
	hy = THE_WORD(y);
	ix = hx & 0x7fffffff;
	iy = hy & 0x7fffffff;
	if (iy == 0) {		/* y = 0 */
		F_RE(ans) = expf(x);
		F_IM(ans) = y;
	} else if (ix == 0x7f800000) {	/* x is +-inf */
		if (hx < 0) {
			if (iy >= 0x7f800000) {
				F_RE(ans) = zero;
				F_IM(ans) = zero;
			} else {
				sincosf(y, &s, &c);
				F_RE(ans) = zero * c;
				F_IM(ans) = zero * s;
			}
		} else {
			if (iy >= 0x7f800000) {
				F_RE(ans) = x;
				F_IM(ans) = y - y;
			} else {
				sincosf(y, &s, &c);
				F_RE(ans) = x * c;
				F_IM(ans) = x * s;
			}
		}
	} else {
		sincosf(y, &s, &c);
		if (ix >= 0x42B171AA) {	/* |x| > 88.722... ~ log(2**128) */
#if defined(__i386) && !defined(__amd64)
			int	rp = __swapRP(fp_extended);
#endif
			t = __k_cexp(x, &n);
			F_RE(ans) = (float)scalbn(t * (double)c, n);
			F_IM(ans) = (float)scalbn(t * (double)s, n);
#if defined(__i386) && !defined(__amd64)
			if (rp != fp_extended)
				(void) __swapRP(rp);
#endif
		} else {
			t = expf(x);
			F_RE(ans) = t * c;
			F_IM(ans) = t * s;
		}
	}
	return (ans);
}
Esempio n. 2
0
fcomplex
csqrtf(fcomplex z) {
	fcomplex ans;
	double dt, dx, dy;
	float x, y, t, ax, ay, w;
	int ix, iy, hx, hy;

	x = F_RE(z);
	y = F_IM(z);
	hx = THE_WORD(x);
	hy = THE_WORD(y);
	ix = hx & 0x7fffffff;
	iy = hy & 0x7fffffff;
	ay = fabsf(y);
	ax = fabsf(x);
	if (ix >= 0x7f800000 || iy >= 0x7f800000) {
		/* x or y is Inf or NaN */
		if (iy == 0x7f800000)
			F_IM(ans) = F_RE(ans) = ay;
		else if (ix == 0x7f800000) {
			if (hx > 0) {
				F_RE(ans) = ax;
				F_IM(ans) = ay * zero;
			} else {
				F_RE(ans) = ay * zero;
				F_IM(ans) = ax;
			}
		} else
			F_IM(ans) = F_RE(ans) = ax + ay;
	} else if (iy == 0) {
		if (hx >= 0) {
			F_RE(ans) = sqrtf(ax);
			F_IM(ans) = zero;
		} else {
			F_IM(ans) = sqrtf(ax);
			F_RE(ans) = zero;
		}
	} else {
		dx = (double) ax;
		dy = (double) ay;
		dt = sqrt(0.5 * (sqrt(dx * dx + dy * dy) + dx));
		t = (float) dt;
		w = (float) (dy / (dt + dt));
		if (hx >= 0) {
			F_RE(ans) = t;
			F_IM(ans) = w;
		} else {
			F_IM(ans) = t;
			F_RE(ans) = w;
		}
	}
	if (hy < 0)
		F_IM(ans) = -F_IM(ans);
	return (ans);
}
Esempio n. 3
0
fcomplex
clogf(fcomplex z) {
	fcomplex	ans;
	float		x, y, ax, ay;
	double		dx, dy;
	int		ix, iy, hx, hy;

	x = F_RE(z);
	y = F_IM(z);
	hx = THE_WORD(x);
	hy = THE_WORD(y);
	ix = hx & 0x7fffffff;
	iy = hy & 0x7fffffff;
	ay = fabsf(y);
	ax = fabsf(x);
	F_IM(ans) = atan2f(y, x);
	if (ix >= 0x7f800000 || iy >= 0x7f800000) {
		/* x or y is Inf or NaN */
		if (iy == 0x7f800000)
			F_RE(ans) = ay;
		else if (ix == 0x7f800000)
			F_RE(ans) = ax;
		else
			F_RE(ans) = ax + ay;
	} else {
#if defined(__i386) && !defined(__amd64)
		int	rp = __swapRP(fp_extended);
#endif
		dx = (double)ax;
		dy = (double)ay;
		if (ix == 0x3f800000)
			F_RE(ans) = (float)(0.5 * log1p(dy * dy));
		else if (iy == 0x3f800000)
			F_RE(ans) = (float)(0.5 * log1p(dx * dx));
		else if ((ix | iy) == 0)
			F_RE(ans) = -1.0f / ax;
		else
			F_RE(ans) = (float)(0.5 * log(dx * dx + dy * dy));
#if defined(__i386) && !defined(__amd64)
		if (rp != fp_extended)
			(void) __swapRP(rp);
#endif
	}
	return (ans);
}
Esempio n. 4
0
fcomplex
csinhf(fcomplex z) {
	float		x, y, S, C;
	double		t;
	int		hx, ix, hy, iy, n;
	fcomplex	ans;

	x = F_RE(z);
	y = F_IM(z);
	hx = THE_WORD(x);
	ix = hx & 0x7fffffff;
	hy = THE_WORD(y);
	iy = hy & 0x7fffffff;
	x = fabsf(x);
	y = fabsf(y);

	sincosf(y, &S, &C);
	if (ix >= 0x41600000) {	/* |x| > 14 = prec/2 (14,28,34,60) */
		if (ix >= 0x42B171AA) {	/* |x| > 88.722... ~ log(2**128) */
			if (ix >= 0x7f800000) {	/* |x| is inf or NaN */
				if (iy == 0) {
					F_RE(ans) = x;
					F_IM(ans) = y;
				} else if (iy >= 0x7f800000) {
					F_RE(ans) = x;
					F_IM(ans) = x - y;
				} else {
					F_RE(ans) = C * x;
					F_IM(ans) = S * x;
				}
			} else {
#if defined(__i386) && !defined(__amd64)
				int	rp = __swapRP(fp_extended);
#endif
				/* return (C, S) * exp(x) / 2 */
				t = __k_cexp((double)x, &n);
				F_RE(ans) = (float)scalbn(C * t, n - 1);
				F_IM(ans) = (float)scalbn(S * t, n - 1);
#if defined(__i386) && !defined(__amd64)
				if (rp != fp_extended)
					(void) __swapRP(rp);
#endif
			}
		} else {
			t = expf(x) * half;
			F_RE(ans) = C * t;
			F_IM(ans) = S * t;
		}
	} else {
		if (ix == 0) {	/* x = 0, return (0,S) */
			F_RE(ans) = zero;
			F_IM(ans) = S;
		} else {
			F_RE(ans) = C * sinhf(x);
			F_IM(ans) = S * coshf(x);
		}
	}
	if (hx < 0)
		F_RE(ans) = -F_RE(ans);
	if (hy < 0)
		F_IM(ans) = -F_IM(ans);
	return (ans);
}