#include <algorithm>
#include <complex>
-namespace boost{
-namespace multiprecision{
-namespace backends{
+namespace boost {
+namespace multiprecision {
+namespace backends {
template <class Backend>
struct complex_adaptor
{
-protected:
+ protected:
Backend m_real, m_imag;
-public:
- Backend& real_data()
+
+ public:
+ Backend& real_data()
{
return m_real;
}
return m_imag;
}
- typedef typename Backend::signed_types signed_types;
- typedef typename Backend::unsigned_types unsigned_types;
- typedef typename Backend::float_types float_types;
- typedef typename Backend::exponent_type exponent_type;
+ typedef typename Backend::signed_types signed_types;
+ typedef typename Backend::unsigned_types unsigned_types;
+ typedef typename Backend::float_types float_types;
+ typedef typename Backend::exponent_type exponent_type;
complex_adaptor() {}
complex_adaptor(const complex_adaptor& o) : m_real(o.real_data()), m_imag(o.imag_data()) {}
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- complex_adaptor(complex_adaptor&& o) : m_real(std::move(o.real_data())), m_imag(std::move(o.imag_data())) {}
+ complex_adaptor(complex_adaptor&& o) : m_real(std::move(o.real_data())), m_imag(std::move(o.imag_data()))
+ {}
#endif
complex_adaptor(const Backend& val)
- : m_real(val) {}
+ : m_real(val)
+ {}
complex_adaptor(const std::complex<float>& val)
{
m_real = val.real();
m_imag = val.imag();
}
-
+
complex_adaptor& operator=(const complex_adaptor& o)
{
m_real = o.real_data();
m_imag = (long double)val.imag();
return *this;
}
- complex_adaptor& operator = (const char* s)
+ complex_adaptor& operator=(const char* s)
{
typedef typename mpl::front<unsigned_types>::type ui_type;
- ui_type zero = 0u;
+ ui_type zero = 0u;
using default_ops::eval_fpclassify;
while (*p && (*p != ',') && (*p != ')'))
++p;
part.assign(s, p);
- if(part.size())
+ if (part.size())
real_data() = part.c_str();
else
real_data() = zero;
}
else
part.erase();
- if(part.size())
+ if (part.size())
imag_data() = part.c_str();
else
imag_data() = zero;
return *this;
}
- int compare(const complex_adaptor& o)const
+ int compare(const complex_adaptor& o) const
{
// They are either equal or not:
return (m_real.compare(o.real_data()) == 0) && (m_imag.compare(o.imag_data()) == 0) ? 0 : 1;
}
template <class T>
- int compare(const T& val)const
+ int compare(const T& val) const
{
using default_ops::eval_is_zero;
return (m_real.compare(val) == 0) && eval_is_zero(m_imag) ? 0 : 1;
real_data().swap(o.real_data());
imag_data().swap(o.imag_data());
}
- std::string str(std::streamsize dig, std::ios_base::fmtflags f)const
+ std::string str(std::streamsize dig, std::ios_base::fmtflags f) const
{
using default_ops::eval_is_zero;
if (eval_is_zero(imag_data()))
inline void eval_divide(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& z)
{
// (a+bi) / (c + di)
- using default_ops::eval_fabs;
+ using default_ops::eval_add;
using default_ops::eval_divide;
+ using default_ops::eval_fabs;
+ using default_ops::eval_is_zero;
using default_ops::eval_multiply;
using default_ops::eval_subtract;
- using default_ops::eval_add;
- using default_ops::eval_is_zero;
Backend t1, t2;
if (eval_is_zero(z.imag_data()))
return;
}
-
eval_fabs(t1, z.real_data());
eval_fabs(t2, z.imag_data());
if (t1.compare(t2) < 0)
}
else
{
- eval_divide(t1, z.imag_data(), z.real_data()); // t1 = d/c
+ eval_divide(t1, z.imag_data(), z.real_data()); // t1 = d/c
eval_multiply(t2, z.imag_data(), t1);
- eval_add(t2, z.real_data()); // denom = d * d/c + c
-
+ eval_add(t2, z.real_data()); // denom = d * d/c + c
+
Backend r_t(result.real_data());
Backend i_t(result.imag_data());
template <class Result, class Backend>
inline typename disable_if_c<boost::is_complex<Result>::value>::type eval_convert_to(Result* result, const complex_adaptor<Backend>& val)
{
- using default_ops::eval_is_zero;
using default_ops::eval_convert_to;
+ using default_ops::eval_is_zero;
if (!eval_is_zero(val.imag_data()))
{
BOOST_THROW_EXCEPTION(std::runtime_error("Could not convert imaginary number to scalar."));
// (|zi| / 2s, +-s) for zr < 0
// where s = sqrt{ [ |zr| + sqrt(zr^2 + zi^2) ] / 2 },
// and the +- sign is the same as the sign of zi.
- using default_ops::eval_get_sign;
using default_ops::eval_abs;
- using default_ops::eval_divide;
using default_ops::eval_add;
+ using default_ops::eval_divide;
+ using default_ops::eval_get_sign;
using default_ops::eval_is_zero;
- if (eval_is_zero(val.imag_data()) && (eval_get_sign(val.real_data())>= 0))
+ if (eval_is_zero(val.imag_data()) && (eval_get_sign(val.real_data()) >= 0))
{
static const typename mpl::front<typename Backend::unsigned_types>::type zero = 0u;
eval_sqrt(result.real_data(), val.real_data());
template <class Backend>
inline void eval_pow(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& b, const complex_adaptor<Backend>& e)
{
- using default_ops::eval_is_zero;
- using default_ops::eval_get_sign;
using default_ops::eval_acos;
- using default_ops::eval_multiply;
- using default_ops::eval_exp;
using default_ops::eval_cos;
+ using default_ops::eval_exp;
+ using default_ops::eval_get_sign;
+ using default_ops::eval_is_zero;
+ using default_ops::eval_multiply;
using default_ops::eval_sin;
if (eval_is_zero(e))
{
if (eval_is_zero(e.real_data()))
{
- Backend n = std::numeric_limits<number<Backend> >::quiet_NaN().backend();
+ Backend n = std::numeric_limits<number<Backend> >::quiet_NaN().backend();
result.real_data() = n;
result.imag_data() = n;
}
else if (eval_get_sign(e.real_data()) < 0)
{
- Backend n = std::numeric_limits<number<Backend> >::infinity().backend();
+ Backend n = std::numeric_limits<number<Backend> >::infinity().backend();
result.real_data() = n;
typename mpl::front<typename Backend::unsigned_types>::type zero(0);
if (eval_is_zero(e.imag_data()))
template <class Backend>
inline void eval_exp(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
- using default_ops::eval_sin;
using default_ops::eval_cos;
using default_ops::eval_exp;
- using default_ops::eval_multiply;
using default_ops::eval_is_zero;
+ using default_ops::eval_multiply;
+ using default_ops::eval_sin;
if (eval_is_zero(arg.imag_data()))
{
template <class Backend>
inline void eval_log(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
- using default_ops::eval_log;
- using default_ops::eval_multiply;
using default_ops::eval_add;
using default_ops::eval_atan2;
- using default_ops::eval_is_zero;
using default_ops::eval_get_sign;
+ using default_ops::eval_is_zero;
+ using default_ops::eval_log;
+ using default_ops::eval_multiply;
if (eval_is_zero(arg.imag_data()) && (eval_get_sign(arg.real_data()) >= 0))
{
template <class Backend>
inline void eval_log10(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
- using default_ops::eval_log;
using default_ops::eval_divide;
+ using default_ops::eval_log;
typedef typename mpl::front<typename Backend::unsigned_types>::type ui_type;
template <class Backend>
inline void eval_sin(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
- using default_ops::eval_sin;
using default_ops::eval_cos;
- using default_ops::eval_sinh;
using default_ops::eval_cosh;
+ using default_ops::eval_sin;
+ using default_ops::eval_sinh;
Backend t1, t2;
eval_sin(t1, arg.real_data());
template <class Backend>
inline void eval_cos(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
- using default_ops::eval_sin;
using default_ops::eval_cos;
- using default_ops::eval_sinh;
using default_ops::eval_cosh;
+ using default_ops::eval_sin;
+ using default_ops::eval_sinh;
Backend t1, t2;
eval_cos(t1, arg.real_data());
inline void eval_acos(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
typedef typename mpl::front<typename Backend::unsigned_types>::type ui_type;
-
+
using default_ops::eval_asin;
Backend half_pi, t1;
inline void eval_atan(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
typedef typename mpl::front<typename Backend::unsigned_types>::type ui_type;
- ui_type one = (ui_type)1u;
+ ui_type one = (ui_type)1u;
using default_ops::eval_add;
+ using default_ops::eval_is_zero;
using default_ops::eval_log;
using default_ops::eval_subtract;
- using default_ops::eval_is_zero;
complex_adaptor<Backend> __my_z_times_i, t1, t2, t3;
assign_components(__my_z_times_i, arg.imag_data(), arg.real_data());
eval_ldexp(result.real_data(), t1.imag_data(), -1);
eval_ldexp(result.imag_data(), t1.real_data(), -1);
- if(!eval_is_zero(result.real_data()))
+ if (!eval_is_zero(result.real_data()))
result.real_data().negate();
}
template <class Backend>
inline void eval_sinh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
- using default_ops::eval_sin;
using default_ops::eval_cos;
- using default_ops::eval_sinh;
using default_ops::eval_cosh;
+ using default_ops::eval_sin;
+ using default_ops::eval_sinh;
Backend t1, t2;
eval_cos(t1, arg.imag_data());
template <class Backend>
inline void eval_cosh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
- using default_ops::eval_sin;
using default_ops::eval_cos;
- using default_ops::eval_sinh;
using default_ops::eval_cosh;
+ using default_ops::eval_sin;
+ using default_ops::eval_sinh;
Backend t1, t2;
eval_cos(t1, arg.imag_data());
inline void eval_asinh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
typedef typename mpl::front<typename Backend::unsigned_types>::type ui_type;
- ui_type one = (ui_type)1u;
+ ui_type one = (ui_type)1u;
using default_ops::eval_add;
using default_ops::eval_log;
inline void eval_acosh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
typedef typename mpl::front<typename Backend::unsigned_types>::type ui_type;
- ui_type one = (ui_type)1u;
+ ui_type one = (ui_type)1u;
using default_ops::eval_add;
- using default_ops::eval_log;
using default_ops::eval_divide;
- using default_ops::eval_subtract;
+ using default_ops::eval_log;
using default_ops::eval_multiply;
+ using default_ops::eval_subtract;
complex_adaptor<Backend> __my_zp(arg);
eval_add(__my_zp.real_data(), one);
inline void eval_atanh(complex_adaptor<Backend>& result, const complex_adaptor<Backend>& arg)
{
typedef typename mpl::front<typename Backend::unsigned_types>::type ui_type;
- ui_type one = (ui_type)1u;
+ ui_type one = (ui_type)1u;
using default_ops::eval_add;
- using default_ops::eval_log;
using default_ops::eval_divide;
- using default_ops::eval_subtract;
+ using default_ops::eval_log;
using default_ops::eval_multiply;
+ using default_ops::eval_subtract;
complex_adaptor<Backend> t1, t2, t3;
eval_add(t1, arg, one);
using default_ops::eval_get_sign;
typedef typename mpl::front<typename Backend::unsigned_types>::type ui_type;
- ui_type zero = (ui_type)0u;
+ ui_type zero = (ui_type)0u;
int c1 = eval_fpclassify(arg.real_data());
int c2 = eval_fpclassify(arg.imag_data());
template <class Backend>
inline std::size_t hash_value(const complex_adaptor<Backend>& val)
{
- std::size_t result = hash_value(val.real_data());
+ std::size_t result = hash_value(val.real_data());
std::size_t result2 = hash_value(val.imag_data());
boost::hash_combine(result, result2);
return result;
} // namespace backends
-
using boost::multiprecision::backends::complex_adaptor;
template <class Backend>
-struct number_category<complex_adaptor<Backend> > : public boost::mpl::int_<boost::multiprecision::number_kind_complex> {};
+struct number_category<complex_adaptor<Backend> > : public boost::mpl::int_<boost::multiprecision::number_kind_complex>
+{};
template <class Backend, expression_template_option ExpressionTemplates>
struct component_type<number<complex_adaptor<Backend>, ExpressionTemplates> >
typedef number<complex_adaptor<Backend>, ExpressionTemplates> type;
};
+}
-} // namespace multiprecision
-
-} // namespaces
+} // namespace boost::multiprecision
#endif