// xcomplex internal header

#if     _MSC_VER > 1000
#pragma once
#endif

#ifndef _XCOMPLEX_
#define _XCOMPLEX_

		// TEMPLATE FUNCTION imag
_TMPLT(_Ty) inline
	_Ty __cdecl imag(const _CMPLX(_Ty)& _X)
	{return (_X.imag()); }
		// TEMPLATE FUNCTION real
_TMPLT(_Ty) inline
	_Ty __cdecl real(const _CMPLX(_Ty)& _X)
	{return (_X.real()); }
		// TEMPLATE FUNCTION _Fabs
_TMPLT(_Ty) inline
	_Ty __cdecl _Fabs(const _CMPLX(_Ty)& _X, int *_Pexp)
	{*_Pexp = 0;
	_Ty _A = real(_X);
	_Ty _B = imag(_X);
	if (_CTR(_Ty)::_Isnan(_A))
		return (_A);
	else if (_CTR(_Ty)::_Isnan(_B))
		return (_B);
	else
		{if (_A < 0)
			_A = -_A;
		if (_B < 0)
			_B = -_B;
		if (_A < _B)
			{_Ty _W = _A;
			_A = _B, _B = _W; }
		if (_A == 0 || _CTR(_Ty)::_Isinf(_A))
			return (_A);
		if (1 <= _A)
			*_Pexp = 2, _A = _A * 0.25, _B = _B * 0.25;
		else
			*_Pexp = -2, _A = _A * 4, _B = _B * 4;
		_Ty _W = _A - _B;
		if (_W == _A)
			return (_A);
		else if (_B < _W)
			{const _Ty _Q = _A / _B;
			return (_A + _B
				/ (_Q + _CTR(_Ty)::sqrt(_Q * _Q + 1))); }
		else
			{static const _Ty _R2 = (const _Ty)1.4142135623730950488L;
			static const _Ty _Xh = (const _Ty)2.4142L;
			static const _Ty _Xl = (const _Ty)0.0000135623730950488016887L;
			const _Ty _Q = _W / _B;
			const _Ty _R = (_Q + 2) * _Q;
			const _Ty _S = _R / (_R2 + _CTR(_Ty)::sqrt(_R + 2))
				+ _Xl + _Q + _Xh;
			return (_A + _B / _S); }}}
		// TEMPLATE FUNCTION operator+
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator+(const _CMPLX(_Ty)& _L,
		const _CMPLX(_Ty)& _R)
	{_CMPLX(_Ty) _W(_L);
	return (_W += _R); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator+(const _CMPLX(_Ty)& _L, const _Ty& _R)
	{_CMPLX(_Ty) _W(_L);
	_W.real(_W.real() + _R);
	return (_W); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator+(const _Ty& _L, const _CMPLX(_Ty)& _R)
	{_CMPLX(_Ty) _W(_L);
	return (_W += _R); }
		// TEMPLATE FUNCTION operator-
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator-(const _CMPLX(_Ty)& _L,
		const _CMPLX(_Ty)& _R)
	{_CMPLX(_Ty) _W(_L);
	return (_W -= _R); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator-(const _CMPLX(_Ty)& _L, const _Ty& _R)
	{_CMPLX(_Ty) _W(_L);
	_W.real(_W.real() - _R);
	return (_W); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator-(const _Ty& _L, const _CMPLX(_Ty)& _R)
	{_CMPLX(_Ty) _W(_L);
	return (_W -= _R); }
		// TEMPLATE FUNCTION operator*
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator*(const _CMPLX(_Ty)& _L,
		const _CMPLX(_Ty)& _R)
	{_CMPLX(_Ty) _W(_L);
	return (_W *= _R); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator*(const _CMPLX(_Ty)& _L, const _Ty& _R)
	{_CMPLX(_Ty) _W(_L);
	_W.real(_W.real() * _R);
	_W.imag(_W.imag() * _R);
	return (_W); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator*(const _Ty& _L, const _CMPLX(_Ty)& _R)
	{_CMPLX(_Ty) _W(_L);
	return (_W *= _R); }
		// TEMPLATE FUNCTION operator/
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator/(const _CMPLX(_Ty)& _L,
		const _CMPLX(_Ty)& _R)
	{_CMPLX(_Ty) _W(_L);
	return (_W /= _R); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator/(const _CMPLX(_Ty)& _L, const _Ty& _R)
	{_CMPLX(_Ty) _W(_L);
	_W.real(_W.real() / _R);
	_W.imag(_W.imag() / _R);
	return (_W); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator/(const _Ty& _L, const _CMPLX(_Ty)& _R)
	{_CMPLX(_Ty) _W(_L);
	return (_W /= _R); }
		// TEMPLATE FUNCTION UNARY operator+
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator+(const _CMPLX(_Ty)& _L)
	{return (_CMPLX(_Ty)(_L)); }
		// TEMPLATE FUNCTION UNARY operator-
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl operator-(const _CMPLX(_Ty)& _L)
	{return (_CMPLX(_Ty)(-real(_L), -imag(_L))); }
		// TEMPLATE FUNCTION operator==
_TMPLT(_Ty) inline
	bool __cdecl operator==(const _CMPLX(_Ty)& _L, const _CMPLX(_Ty)& _R)
	{return (real(_L) == real(_R) && imag(_L) == imag(_R)); }
_TMPLT(_Ty) inline
	bool __cdecl operator==(const _CMPLX(_Ty)& _L, const _Ty& _R)
	{return (real(_L) == _R && imag(_L) == 0); }
_TMPLT(_Ty) inline
	bool __cdecl operator==(const _Ty& _L, const _CMPLX(_Ty)& _R)
	{return (_L == real(_R) && 0 == imag(_R)); }
_TMPLT(_Ty) inline
	bool __cdecl operator!=(const _CMPLX(_Ty)& _L, const _CMPLX(_Ty)& _R)
	{return (!(_L == _R)); }
_TMPLT(_Ty) inline
	bool __cdecl operator!=(const _CMPLX(_Ty)& _L, const _Ty& _R)
	{return (!(_L == _R)); }
_TMPLT(_Ty) inline
	bool __cdecl operator!=(const _Ty& _L, const _CMPLX(_Ty)& _R)
	{return (!(_L == _R)); }
		// TEMPLATE FUNCTION abs
_TMPLT(_Ty) inline
	_Ty __cdecl abs(const _CMPLX(_Ty)& _X)
	{int _Xexp;
	_Ty _Rho = _Fabs(_X, &_Xexp);
	if (_Xexp == 0)
		return (_Rho);
	else
		return (_CTR(_Ty)::ldexp(_Rho, _Xexp)); }
		// TEMPLATE FUNCTION arg
_TMPLT(_Ty) inline
	_Ty __cdecl arg(const _CMPLX(_Ty)& _X)
	{return (_CTR(_Ty)::atan2(imag(_X), real(_X))); }
		// TEMPLATE FUNCTION conjg
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl conj(const _CMPLX(_Ty)& _X)
	{return (_CMPLX(_Ty)(real(_X), -imag(_X))); }
		// TEMPLATE FUNCTION cos
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl cos(const _CMPLX(_Ty)& _X)
	{return (_CMPLX(_Ty)(
		_CTR(_Ty)::_Cosh(imag(_X), _CTR(_Ty)::cos(real(_X))),
		-_CTR(_Ty)::_Sinh(imag(_X),
			_CTR(_Ty)::sin(real(_X))))); }
		// TEMPLATE FUNCTION cosh
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl cosh(const _CMPLX(_Ty)& _X)
	{return (_CMPLX(_Ty)(
		_CTR(_Ty)::_Cosh(real(_X), _CTR(_Ty)::cos(imag(_X))),
		_CTR(_Ty)::_Sinh(real(_X), _CTR(_Ty)::sin(imag(_X))))); }
		// TEMPLATE FUNCTION exp
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl exp(const _CMPLX(_Ty)& _X)
	{_Ty _Re(real(_X)), _Im(real(_X));
	_CTR(_Ty)::_Exp(&_Re, _CTR(_Ty)::cos(imag(_X)), 0);
	_CTR(_Ty)::_Exp(&_Im, _CTR(_Ty)::sin(imag(_X)), 0);
	return (_CMPLX(_Ty)(_Re, _Im)); }
		// TEMPLATE FUNCTION log
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl log(const _CMPLX(_Ty)& _X)
	{int _Xexp;
	_Ty _Rho = _Fabs(_X, &_Xexp);
	if (_CTR(_Ty)::_Isnan(_Rho))
		return (_CMPLX(_Ty)(_Rho, _Rho));
	else
		{static const _Ty _Cm = 22713.0 / 32768.0;
		static const _Ty _Cl = (const _Ty)1.428606820309417232e-6L;
		_Ty _Xn = _Xexp;
		_CMPLX(_Ty) _W(_Rho == 0 ? -_CTR(_Ty)::_Infv(_Rho)
			: _CTR(_Ty)::_Isinf(_Rho) ? _Rho
			: _CTR(_Ty)::log(_Rho) + _Xn * _Cl + _Xn * _Cm,
				_CTR(_Ty)::atan2(imag(_X), real(_X)));
		return (_W); }}
		// TEMPLATE FUNCTION log10
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl log10(const _CMPLX(_Ty)& _X)
	{return (log(_X) * (_Ty)0.4342944819032518276511289L); }
		// TEMPLATE FUNCTION norm
_TMPLT(_Ty) inline
	_Ty __cdecl norm(const _CMPLX(_Ty)& _X)
	{return (real(_X) * real(_X) + imag(_X) * imag(_X)); }
		// TEMPLATE FUNCTION polar
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl polar(const _Ty& _Rho, const _Ty& _Theta)
	{return (_CMPLX(_Ty)(_Rho * _CTR(_Ty)::cos(_Theta),
		_Rho * _CTR(_Ty)::sin(_Theta))); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl polar(const _Ty& _Rho)
	{return (polar(_Rho, (_Ty)0)); }
		// TEMPLATE FUNCTION pow
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl pow(const _CMPLX(_Ty)& _X,
		const _CMPLX(_Ty)& _Y)
	{if (imag(_Y) == 0)
		return (pow(_X, real(_Y)));
	else if (imag(_X) == 0)
		return (_CMPLX(_Ty)(pow(real(_X), _Y)));
	else
		return (exp(_Y * log(_X))); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl pow(const _CMPLX(_Ty)& _X, const _Ty& _Y)
	{if (imag(_X) == 0)
		return (_CMPLX(_Ty)(_CTR(_Ty)::pow(real(_X), _Y)));
	else
		return (exp(_Y * log(_X))); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl pow(const _CMPLX(_Ty)& _X, int _Y)
	{if (imag(_X) == 0)
		return (_CMPLX(_Ty)(_CTR(_Ty)::pow(real(_X), _Y)));
	else
		return (_Pow_int(_CMPLX(_Ty)(_X), _Y)); }
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl pow(const _Ty& _X, const _CMPLX(_Ty)& _Y)
	{if (imag(_Y) == 0)
		return (_CMPLX(_Ty)(_CTR(_Ty)::pow(_X, real(_Y))));
	else
		return (exp(_Y * _CTR(_Ty)::log(_X))); }
		// TEMPLATE FUNCTION sin
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl sin(const _CMPLX(_Ty)& _X)
	{return (_CMPLX(_Ty)(
		_CTR(_Ty)::_Cosh(imag(_X), _CTR(_Ty)::sin(real(_X))),
		_CTR(_Ty)::_Sinh(imag(_X), _CTR(_Ty)::cos(real(_X))))); }
		// TEMPLATE FUNCTION sinh
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl sinh(const _CMPLX(_Ty)& _X)
	{return (_CMPLX(_Ty)(
		_CTR(_Ty)::_Sinh(real(_X), _CTR(_Ty)::cos(imag(_X))),
		_CTR(_Ty)::_Cosh(real(_X), _CTR(_Ty)::sin(imag(_X))))); }
		// TEMPLATE FUNCTION sqrt
_TMPLT(_Ty) inline
	_CMPLX(_Ty) __cdecl sqrt(const _CMPLX(_Ty)& _X)
	{int _Xexp;
	_Ty _Rho = _Fabs(_X, &_Xexp);
	if (_Xexp == 0)
		return (_CMPLX(_Ty)(_Rho, _Rho));
	else
		{_Ty _Remag = _CTR(_Ty)::ldexp(real(_X) < 0
			? - real(_X) : real(_X), -_Xexp);
		_Rho = _CTR(_Ty)::ldexp(_CTR(_Ty)::sqrt(
			2 * (_Remag + _Rho)), _Xexp / 2 - 1);
		if (0 <= real(_X))
			return (_CMPLX(_Ty)(_Rho, imag(_X) / (2 * _Rho)));
		else if (imag(_X) < 0)
			return (_CMPLX(_Ty)(-imag(_X) / (2 * _Rho), -_Rho));
		else
			return (_CMPLX(_Ty)(imag(_X) / (2 * _Rho),
				_Rho)); }}

#ifdef _DLL
#pragma warning(disable:4231) /* the extern before template is a non-standard extension */

extern template _CRTIMP complex<float>& __cdecl operator+=(
        complex<float>&, const complex<float>&);
extern template _CRTIMP complex<float>& __cdecl operator-=(
        complex<float>&, const complex<float>&);
extern template _CRTIMP complex<float>& __cdecl operator*=(
        complex<float>&, const complex<float>&);
extern template _CRTIMP complex<float>& __cdecl operator/=(
        complex<float>&, const complex<float>&);

extern template _CRTIMP basic_istream<char, char_traits<char> >& __cdecl operator>>(
        basic_istream<char, char_traits<char> >&, complex<float>&);
extern template _CRTIMP basic_ostream<char, char_traits<char> >& __cdecl operator<<(
        basic_ostream<char, char_traits<char> >&, const complex<float>&);
extern template _CRTIMP basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl operator>>(
        basic_istream<wchar_t, char_traits<wchar_t> >&, complex<float>&);
extern template _CRTIMP basic_ostream<wchar_t, char_traits<wchar_t> >& __cdecl operator<<(
        basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<float>&);

extern template _CRTIMP complex<double>& __cdecl operator+=(
        complex<double>&, const complex<double>&);
extern template _CRTIMP complex<double>& __cdecl operator-=(
        complex<double>&, const complex<double>&);
extern template _CRTIMP complex<double>& __cdecl operator*=(
        complex<double>&, const complex<double>&);
extern template _CRTIMP complex<double>& __cdecl operator/=(
        complex<double>&, const complex<double>&);
extern template _CRTIMP basic_istream<char, char_traits<char> >& __cdecl operator>>(
        basic_istream<char, char_traits<char> >&, complex<double>&);
extern template _CRTIMP basic_ostream<char, char_traits<char> >& __cdecl operator<<(
        basic_ostream<char, char_traits<char> >&, const complex<double>&);
extern template _CRTIMP basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl operator>>(
        basic_istream<wchar_t, char_traits<wchar_t> >&, complex<double>&);
extern template _CRTIMP basic_ostream<wchar_t, char_traits<wchar_t> >& __cdecl operator<<(
        basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<double>&);

extern template _CRTIMP complex<long double>& __cdecl operator+=(
        complex<long double>&, const complex<long double>&);
extern template _CRTIMP complex<long double>& __cdecl operator-=(
        complex<long double>&, const complex<long double>&);
extern template _CRTIMP complex<long double>& __cdecl operator*=(
        complex<long double>&, const complex<long double>&);
extern template _CRTIMP complex<long double>& __cdecl operator/=(
        complex<long double>&, const complex<long double>&);
extern template _CRTIMP basic_istream<char, char_traits<char> >& __cdecl operator>>(
        basic_istream<char, char_traits<char> >&, complex<long double>&);
extern template _CRTIMP basic_ostream<char, char_traits<char> >& __cdecl operator<<(
        basic_ostream<char, char_traits<char> >&, const complex<long double>&);
extern template _CRTIMP basic_istream<wchar_t, char_traits<wchar_t> >& __cdecl operator>>(
        basic_istream<wchar_t, char_traits<wchar_t> >&, complex<long double>&);
extern template _CRTIMP basic_ostream<wchar_t, char_traits<wchar_t> >& __cdecl operator<<(
        basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<long double>&);

extern template _CRTIMP float __cdecl imag(const complex<float>&);
extern template _CRTIMP float __cdecl real(const complex<float>&);
extern template _CRTIMP float __cdecl _Fabs(const complex<float>&, int *);
extern template _CRTIMP complex<float> __cdecl operator+(
        const complex<float>&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl operator+(
        const complex<float>&, const float&);
extern template _CRTIMP complex<float> __cdecl operator+(
        const float&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl operator-(
        const complex<float>&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl operator-(
        const complex<float>&, const float&);
extern template _CRTIMP    complex<float> __cdecl operator-(
        const float&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl operator*(
        const complex<float>&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl operator*(
        const complex<float>&, const float&);
extern template _CRTIMP complex<float> __cdecl operator*(
        const float&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl operator/(
        const complex<float>&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl operator/(
        const complex<float>&, const float&);
extern template _CRTIMP complex<float> __cdecl operator/(
        const float&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl operator+(
        const complex<float>&);
extern template _CRTIMP complex<float> __cdecl operator-(
        const complex<float>&);
extern template _CRTIMP bool __cdecl operator==(
        const complex<float>&, const complex<float>&);
extern template _CRTIMP bool __cdecl operator==(
        const complex<float>&, const float&);
extern template _CRTIMP bool __cdecl operator==(
        const float&, const complex<float>&);
extern template _CRTIMP bool __cdecl operator!=(
        const complex<float>&, const complex<float>&);
extern template _CRTIMP bool __cdecl operator!=(
        const complex<float>&, const float&);
extern template _CRTIMP bool __cdecl operator!=(
        const float&, const complex<float>&);
extern template _CRTIMP float __cdecl abs(const complex<float>&);
extern template _CRTIMP float __cdecl arg(const complex<float>&);
extern template _CRTIMP complex<float> __cdecl conj(const complex<float>&);
extern template _CRTIMP complex<float> __cdecl cos(const complex<float>&);
extern template _CRTIMP complex<float> __cdecl cosh(const complex<float>&);
extern template _CRTIMP complex<float> __cdecl exp(const complex<float>&);
extern template _CRTIMP complex<float> __cdecl log(const complex<float>&);
extern template _CRTIMP complex<float> __cdecl log10(const complex<float>&);
extern template _CRTIMP float __cdecl norm(const complex<float>&);
extern template _CRTIMP complex<float> __cdecl polar(const float&, const float&);
extern template _CRTIMP complex<float> __cdecl polar(const float&);
extern template _CRTIMP complex<float> __cdecl pow(
        const complex<float>&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl pow(
        const complex<float>&, const float&);
extern template _CRTIMP complex<float> __cdecl pow(
        const complex<float>&, int);
extern template _CRTIMP complex<float> __cdecl pow(
        const float&, const complex<float>&);
extern template _CRTIMP complex<float> __cdecl sin(const complex<float>&);
extern template _CRTIMP complex<float> __cdecl sinh(const complex<float>&);
extern template _CRTIMP complex<float> __cdecl sqrt(const complex<float>&);

extern template _CRTIMP double __cdecl imag(const complex<double>&);
extern template _CRTIMP double __cdecl real(const complex<double>&);
extern template _CRTIMP double __cdecl _Fabs(const complex<double>&, int *);
extern template _CRTIMP complex<double> __cdecl operator+(
        const complex<double>&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl operator+(
        const complex<double>&, const double&);
extern template _CRTIMP complex<double> __cdecl operator+(
        const double&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl operator-(
        const complex<double>&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl operator-(
        const complex<double>&, const double&);
extern template _CRTIMP    complex<double> __cdecl operator-(
        const double&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl operator*(
        const complex<double>&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl operator*(
        const complex<double>&, const double&);
extern template _CRTIMP complex<double> __cdecl operator*(
        const double&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl operator/(
        const complex<double>&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl operator/(
        const complex<double>&, const double&);
extern template _CRTIMP complex<double> __cdecl operator/(
        const double&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl operator+(
        const complex<double>&);
extern template _CRTIMP complex<double> __cdecl operator-(
        const complex<double>&);
extern template _CRTIMP bool __cdecl operator==(
        const complex<double>&, const complex<double>&);
extern template _CRTIMP bool __cdecl operator==(
        const complex<double>&, const double&);
extern template _CRTIMP bool __cdecl operator==(
        const double&, const complex<double>&);
extern template _CRTIMP bool __cdecl operator!=(
        const complex<double>&, const complex<double>&);
extern template _CRTIMP bool __cdecl operator!=(
        const complex<double>&, const double&);
extern template _CRTIMP bool __cdecl operator!=(
        const double&, const complex<double>&);
extern template _CRTIMP double __cdecl abs(const complex<double>&);
extern template _CRTIMP double __cdecl arg(const complex<double>&);
extern template _CRTIMP complex<double> __cdecl conj(const complex<double>&);
extern template _CRTIMP complex<double> __cdecl cos(const complex<double>&);
extern template _CRTIMP complex<double> __cdecl cosh(const complex<double>&);
extern template _CRTIMP complex<double> __cdecl exp(const complex<double>&);
extern template _CRTIMP complex<double> __cdecl log(const complex<double>&);
extern template _CRTIMP complex<double> __cdecl log10(const complex<double>&);
extern template _CRTIMP double __cdecl norm(const complex<double>&);
extern template _CRTIMP complex<double> __cdecl polar(const double&, const double&);
extern template _CRTIMP complex<double> __cdecl polar(const double&);
extern template _CRTIMP complex<double> __cdecl pow(
        const complex<double>&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl pow(
        const complex<double>&, const double&);
extern template _CRTIMP complex<double> __cdecl pow(
        const complex<double>&, int);
extern template _CRTIMP complex<double> __cdecl pow(
        const double&, const complex<double>&);
extern template _CRTIMP complex<double> __cdecl sin(const complex<double>&);
extern template _CRTIMP complex<double> __cdecl sinh(const complex<double>&);
extern template _CRTIMP complex<double> __cdecl sqrt(const complex<double>&);

extern template _CRTIMP long double __cdecl imag(const complex<long double>&);
extern template _CRTIMP long double __cdecl real(const complex<long double>&);
extern template _CRTIMP long double __cdecl _Fabs(const complex<long double>&, int *);
extern template _CRTIMP complex<long double> __cdecl operator+(
        const complex<long double>&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl operator+(
        const complex<long double>&, const long double&);
extern template _CRTIMP complex<long double> __cdecl operator+(
        const long double&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl operator-(
        const complex<long double>&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl operator-(
        const complex<long double>&, const long double&);
extern template _CRTIMP    complex<long double> __cdecl operator-(
        const long double&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl operator*(
        const complex<long double>&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl operator*(
        const complex<long double>&, const long double&);
extern template _CRTIMP complex<long double> __cdecl operator*(
        const long double&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl operator/(
        const complex<long double>&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl operator/(
        const complex<long double>&, const long double&);
extern template _CRTIMP complex<long double> __cdecl operator/(
        const long double&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl operator+(
        const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl operator-(
        const complex<long double>&);
extern template _CRTIMP bool __cdecl operator==(
        const complex<long double>&, const complex<long double>&);
extern template _CRTIMP bool __cdecl operator==(
        const complex<long double>&, const long double&);
extern template _CRTIMP bool __cdecl operator==(
        const long double&, const complex<long double>&);
extern template _CRTIMP bool __cdecl operator!=(
        const complex<long double>&, const complex<long double>&);
extern template _CRTIMP bool __cdecl operator!=(
        const complex<long double>&, const long double&);
extern template _CRTIMP bool __cdecl operator!=(
        const long double&, const complex<long double>&);
extern template _CRTIMP long double __cdecl abs(const complex<long double>&);
extern template _CRTIMP long double __cdecl arg(const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl conj(const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl cos(const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl cosh(const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl exp(const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl log(const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl log10(const complex<long double>&);
extern template _CRTIMP long double __cdecl norm(const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl polar(const long double&, const long double&);
extern template _CRTIMP complex<long double> __cdecl polar(const long double&);
extern template _CRTIMP complex<long double> __cdecl pow(
        const complex<long double>&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl pow(
        const complex<long double>&, const long double&);
extern template _CRTIMP complex<long double> __cdecl pow(
        const complex<long double>&, int);
extern template _CRTIMP complex<long double> __cdecl pow(
        const long double&, const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl sin(const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl sinh(const complex<long double>&);
extern template _CRTIMP complex<long double> __cdecl sqrt(const complex<long double>&);

#pragma warning(default:4231) /* restore previous warning */
#endif		// _DLL

#endif          /* _XCOMPLEX */

/*
 * Copyright (c) 1996 by P.J. Plauger.  ALL RIGHTS RESERVED. 
 * Consult your license regarding permissions and restrictions.
 */
