diff -r 000000000000 -r e4d67989cc36 stdcpp/src/complex_exp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stdcpp/src/complex_exp.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,261 @@ +/* + * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. + * Copyright (c) 1999 + * Silicon Graphics Computer Systems, Inc. + * + * Copyright (c) 1999 + * Boris Fomitchev + * + * This material is provided "as is", with absolutely no warranty expressed + * or implied. Any use is at your own risk. + * + * Permission to use or copy this software for any purpose is hereby granted + * without fee, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + * + */ + +# include "stlport_prefix.h" +// exp, log, pow for complex, complex, and complex + +#include +#include "complex_impl.h" + +#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) +#include "libstdcppwsd.h" +# endif + +_STLP_BEGIN_NAMESPACE + +//---------------------------------------------------------------------- +// exp + +_STLP_EXP_DECLSPEC complex _STLP_CALL +exp(const complex& z) +{ + float expx = _STLP_EXPF(z._M_re); + return complex(expx * _STLP_COSF(z._M_im), + expx * _STLP_SINF(z._M_im)); +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL exp(const complex& z) +{ + double expx = _STLP_EXP(z._M_re); + return complex(expx * _STLP_COS(z._M_im), + expx * _STLP_SIN(z._M_im)); +} + +# ifndef _STLP_NO_LONG_DOUBLE +_STLP_EXP_DECLSPEC complex _STLP_CALL exp(const complex& z) +{ + long double expx = _STLP_EXPL(z._M_re); + return complex(expx * _STLP_COSL(z._M_im), + expx * _STLP_SINL(z._M_im)); +} +# endif + +//---------------------------------------------------------------------- +// log10 + +_STLP_EXP_DECLSPEC complex _STLP_CALL log10(const complex& z) +{ + complex r; + +#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) + get_complex_exp_float_ln10_inv() = 1.f / _STLP_LOGF(10.f); + r._M_im = _STLP_ATAN2F(z._M_im, z._M_re) * get_complex_exp_float_ln10_inv(); +# else + static float ln10_inv = 1.f / _STLP_LOGF(10.f); + r._M_im = _STLP_ATAN2F(z._M_im, z._M_re) * ln10_inv; +# endif //__LIBSTD_CPP_SYMBIAN32_WSD__ + + r._M_re = _STLP_LOG10F(_STLP_HYPOTF(z._M_re, z._M_im)); + return r; +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL log10(const complex& z) +{ + complex r; + +#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) + get_complex_exp_double_ln10_inv() = 1. / _STLP_LOG(10.); + r._M_im = _STLP_ATAN2(z._M_im, z._M_re) * get_complex_exp_double_ln10_inv(); +# else + static double ln10_inv = 1. / _STLP_LOG(10.); + r._M_im = _STLP_ATAN2(z._M_im, z._M_re) * ln10_inv; +# endif //__LIBSTD_CPP_SYMBIAN32_WSD__ + + r._M_re = _STLP_LOG10(_STLP_HYPOT(z._M_re, z._M_im)); + return r; +} + +#ifndef _STLP_NO_LONG_DOUBLE +_STLP_EXP_DECLSPEC complex _STLP_CALL log10(const complex& z) +{ + complex result; +#if defined(__LIBSTD_CPP_SYMBIAN32_WSD__) || defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) + get_complex_exp_long_double_ln10_inv() = 1.l / _STLP_LOGL(10.l); + result._M_im = _STLP_ATAN2L(z._M_im, z._M_re) * get_complex_exp_long_double_ln10_inv(); +# else + static long double ln10_inv = 1.l / _STLP_LOGL(10.l); + result._M_im = _STLP_ATAN2L(z._M_im, z._M_re) * ln10_inv; +# endif //__LIBSTD_CPP_SYMBIAN32_WSD__ + + result._M_re = _STLP_LOG10L(_STLP_HYPOTL(z._M_re, z._M_im)); + return result; +} +# endif + +//---------------------------------------------------------------------- +// log + +_STLP_EXP_DECLSPEC complex _STLP_CALL log(const complex& z) +{ + complex r; + + r._M_im = _STLP_ATAN2F(z._M_im, z._M_re); + r._M_re = _STLP_LOGF(_STLP_HYPOTF(z._M_re, z._M_im)); + return r; +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL log(const complex& z) +{ + complex r; + + r._M_im = _STLP_ATAN2(z._M_im, z._M_re); + r._M_re = _STLP_LOG(_STLP_HYPOT(z._M_re, z._M_im)); + return r; +} + +#ifndef _STLP_NO_LONG_DOUBLE +_STLP_EXP_DECLSPEC complex _STLP_CALL log(const complex& z) +{ + complex result; + + result._M_im = _STLP_ATAN2L(z._M_im, z._M_re); + result._M_re = _STLP_LOGL(_STLP_HYPOTL(z._M_re, z._M_im)); + return result; +} +# endif + +//---------------------------------------------------------------------- +// pow + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const float& a, const complex& b) { + float logr = _STLP_LOGF(a); + float x = _STLP_EXPF(logr*b._M_re); + float y = logr*b._M_im; + + return complex(x * _STLP_COSF(y), x * _STLP_SINF(y)); +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const complex& z_in, int n) { + complex z = z_in; + z = __power(z, (n < 0 ? -n : n), multiplies< complex >()); + if (n < 0) + return 1.f / z; + else + return z; +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const complex& a, const float& b) { + float logr = _STLP_LOGF(_STLP_HYPOTF(a._M_re,a._M_im)); + float logi = _STLP_ATAN2F(a._M_im, a._M_re); + float x = _STLP_EXPF(logr * b); + float y = logi * b; + + return complex(x * _STLP_COSF(y), x * _STLP_SINF(y)); +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const complex& a, const complex& b) { + float logr = _STLP_LOGF(_STLP_HYPOTF(a._M_re,a._M_im)); + float logi = _STLP_ATAN2F(a._M_im, a._M_re); + float x = _STLP_EXPF(logr*b._M_re - logi*b._M_im); + float y = logr*b._M_im + logi*b._M_re; + + return complex(x * _STLP_COSF(y), x * _STLP_SINF(y)); +} + + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const double& a, const complex& b) { + double logr = _STLP_LOG(a); + double x = _STLP_EXP(logr*b._M_re); + double y = logr*b._M_im; + + return complex(x * _STLP_COS(y), x * _STLP_SIN(y)); +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const complex& z_in, int n) { + complex z = z_in; + z = __power(z, (n < 0 ? -n : n), multiplies< complex >()); + if (n < 0) +#if !defined(__SC__) //*TY 04/15/2000 - + return 1. / z; +#else //*TY 04/15/2000 - added workaround for SCpp compiler + return double(1.0) / z; //*TY 04/15/2000 - it incorrectly assign long double attribute to floating point literals +#endif //*TY 04/15/2000 - + else + return z; +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const complex& a, const double& b) { + double logr = _STLP_LOG(_STLP_HYPOT(a._M_re,a._M_im)); + double logi = _STLP_ATAN2(a._M_im, a._M_re); + double x = _STLP_EXP(logr * b); + double y = logi * b; + + return complex(x * _STLP_COS(y), x * _STLP_SIN(y)); +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const complex& a, const complex& b) { + double logr = _STLP_LOG(_STLP_HYPOT(a._M_re,a._M_im)); + double logi = _STLP_ATAN2(a._M_im, a._M_re); + double x = _STLP_EXP(logr*b._M_re - logi*b._M_im); + double y = logr*b._M_im + logi*b._M_re; + + return complex(x * _STLP_COS(y), x * _STLP_SIN(y)); +} + + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const long double& a, + const complex& b) { + long double logr = _STLP_LOGL(a); + long double x = _STLP_EXPL(logr*b._M_re); + long double y = logr*b._M_im; + + return complex(x * _STLP_COSL(y), x * _STLP_SINL(y)); +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const complex& z_in, int n) { + complex z = z_in; + z = __power(z, (n < 0 ? -n : n), multiplies< complex >()); + if (n < 0) + return 1.l / z; + else + return z; +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const complex& a, + const long double& b) { + long double logr = _STLP_LOGL(_STLP_HYPOTL(a._M_re,a._M_im)); + long double logi = _STLP_ATAN2L(a._M_im, a._M_re); + long double x = _STLP_EXPL(logr * b); + long double y = logi * b; + + return complex(x * _STLP_COSL(y), x * _STLP_SINL(y)); +} + +_STLP_EXP_DECLSPEC complex _STLP_CALL pow(const complex& a, + const complex& b) { + long double logr = _STLP_LOGL(_STLP_HYPOTL(a._M_re,a._M_im)); + long double logi = _STLP_ATAN2L(a._M_im, a._M_re); + long double x = _STLP_EXPL(logr*b._M_re - logi*b._M_im); + long double y = logr*b._M_im + logi*b._M_re; + + return complex(x * _STLP_COSL(y), x * _STLP_SINL(y)); +} + +_STLP_END_NAMESPACE +