6 #include <symengine/complex_mpc.h>
8 #include <symengine/symengine_exception.h>
10 #ifdef HAVE_SYMENGINE_MPC
14 ComplexMPC::ComplexMPC(mpc_class i)
15 : i{
std::
move(i)} {SYMENGINE_ASSIGN_TYPEID()}
17 hash_t ComplexMPC::__hash__()
const
19 hash_t seed = SYMENGINE_COMPLEX_MPC;
25 bool ComplexMPC::__eq__(
const Basic &o)
const
27 if (is_a<ComplexMPC>(o)) {
28 const ComplexMPC &s = down_cast<const ComplexMPC &>(o);
29 if (get_prec() == s.get_prec()) {
30 return mpc_cmp(this->i.get_mpc_t(), s.i.get_mpc_t()) == 0;
36 int ComplexMPC::compare(
const Basic &o)
const
38 SYMENGINE_ASSERT(is_a<ComplexMPC>(o))
39 const ComplexMPC &s = down_cast<const ComplexMPC &>(o);
40 if (get_prec() == s.get_prec()) {
41 int cmp = mpc_cmp(this->i.get_mpc_t(), s.i.get_mpc_t());
42 int x = MPC_INEX_RE(cmp), y = MPC_INEX_IM(cmp);
45 return y > 0 ? 1 : -1;
48 return x > 0 ? 1 : -1;
50 return get_prec() > s.get_prec() ? 1 : -1;
54 RCP<const Number> ComplexMPC::real_part()
const
56 mpfr_class t(get_prec());
57 mpc_real(t.get_mpfr_t(), i.get_mpc_t(), MPFR_RNDN);
61 RCP<const Number> ComplexMPC::imaginary_part()
const
63 mpfr_class t(get_prec());
64 mpc_imag(t.get_mpfr_t(), i.get_mpc_t(), MPFR_RNDN);
68 RCP<const Basic> ComplexMPC::conjugate()
const
70 mpc_class t(get_prec());
71 mpc_conj(t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
72 return make_rcp<const ComplexMPC>(
std::move(t));
80 mpc_class t(get_prec());
81 mpc_set_z(t.get_mpc_t(), get_mpz_t(other.as_integer_class()), MPFR_RNDN);
82 mpc_add(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
83 return make_rcp<const ComplexMPC>(
std::move(t));
91 mpc_class t(get_prec());
92 mpc_set_q(t.get_mpc_t(), get_mpq_t(other.as_rational_class()), MPFR_RNDN);
93 mpc_add(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
94 return make_rcp<const ComplexMPC>(
std::move(t));
102 mpc_class t(get_prec());
103 mpc_set_q_q(t.get_mpc_t(), get_mpq_t(other.real_),
104 get_mpq_t(other.imaginary_), MPFR_RNDN);
105 mpc_add(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
106 return make_rcp<const ComplexMPC>(
std::move(t));
114 mpc_class t(get_prec());
115 mpc_set_d(t.get_mpc_t(), other.i, MPFR_RNDN);
116 mpc_add(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
117 return make_rcp<const ComplexMPC>(
std::move(t));
125 mpc_class t(get_prec());
126 mpc_set_d_d(t.get_mpc_t(), other.i.real(), other.i.imag(), MPFR_RNDN);
127 mpc_add(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
128 return make_rcp<const ComplexMPC>(
std::move(t));
136 mpc_class t(
std::max(get_prec(), other.get_prec()));
137 mpc_add_fr(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpfr_t(), MPFR_RNDN);
138 return make_rcp<const ComplexMPC>(
std::move(t));
146 mpc_class t(
std::max(get_prec(), other.get_prec()));
147 mpc_add(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpc_t(), MPFR_RNDN);
148 return make_rcp<const ComplexMPC>(
std::move(t));
156 mpc_class t(get_prec());
157 mpc_set_z(t.get_mpc_t(), get_mpz_t(other.as_integer_class()), MPFR_RNDN);
158 mpc_sub(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
159 return make_rcp<const ComplexMPC>(
std::move(t));
167 mpc_class t(get_prec());
168 mpc_set_q(t.get_mpc_t(), get_mpq_t(other.as_rational_class()), MPFR_RNDN);
169 mpc_sub(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
170 return make_rcp<const ComplexMPC>(
std::move(t));
178 mpc_class t(get_prec());
179 mpc_set_q_q(t.get_mpc_t(), get_mpq_t(other.real_),
180 get_mpq_t(other.imaginary_), MPFR_RNDN);
181 mpc_sub(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
182 return make_rcp<const ComplexMPC>(
std::move(t));
190 mpc_class t(get_prec());
191 mpc_set_d(t.get_mpc_t(), other.i, MPFR_RNDN);
192 mpc_sub(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
193 return make_rcp<const ComplexMPC>(
std::move(t));
201 mpc_class t(get_prec());
202 mpc_set_d_d(t.get_mpc_t(), other.i.real(), other.i.imag(), MPFR_RNDN);
203 mpc_sub(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
204 return make_rcp<const ComplexMPC>(
std::move(t));
212 mpc_class t(
std::max(get_prec(), other.get_prec()));
213 mpc_sub_fr(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpfr_t(), MPFR_RNDN);
214 return make_rcp<const ComplexMPC>(
std::move(t));
222 mpc_class t(
std::max(get_prec(), other.get_prec()));
223 mpc_sub(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpc_t(), MPFR_RNDN);
224 return make_rcp<const ComplexMPC>(
std::move(t));
230 RCP<const Number> ComplexMPC::rsub(
const Integer &other)
const
232 mpc_class t(get_prec());
233 mpc_set_z(t.get_mpc_t(), get_mpz_t(other.as_integer_class()), MPFR_RNDN);
234 mpc_sub(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
235 return make_rcp<const ComplexMPC>(
std::move(t));
241 RCP<const Number> ComplexMPC::rsub(
const Rational &other)
const
243 mpc_class t(get_prec());
244 mpc_set_q(t.get_mpc_t(), get_mpq_t(other.as_rational_class()), MPFR_RNDN);
245 mpc_sub(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
246 return make_rcp<const ComplexMPC>(
std::move(t));
252 RCP<const Number> ComplexMPC::rsub(
const Complex &other)
const
254 mpc_class t(get_prec());
255 mpc_set_q_q(t.get_mpc_t(), get_mpq_t(other.real_),
256 get_mpq_t(other.imaginary_), MPFR_RNDN);
257 mpc_sub(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
258 return make_rcp<const ComplexMPC>(
std::move(t));
264 RCP<const Number> ComplexMPC::rsub(
const RealDouble &other)
const
266 mpc_class t(get_prec());
267 mpc_set_d(t.get_mpc_t(), other.i, MPFR_RNDN);
268 mpc_sub(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
269 return make_rcp<const ComplexMPC>(
std::move(t));
275 RCP<const Number> ComplexMPC::rsub(
const ComplexDouble &other)
const
277 mpc_class t(get_prec());
278 mpc_set_d_d(t.get_mpc_t(), other.i.real(), other.i.imag(), MPFR_RNDN);
279 mpc_sub(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
280 return make_rcp<const ComplexMPC>(
std::move(t));
286 RCP<const Number> ComplexMPC::rsub(
const RealMPFR &other)
const
288 mpc_class t(
std::max(get_prec(), other.get_prec()));
289 mpc_fr_sub(t.get_mpc_t(), other.i.get_mpfr_t(), i.get_mpc_t(), MPFR_RNDN);
290 return make_rcp<const ComplexMPC>(
std::move(t));
296 RCP<const Number> ComplexMPC::mul(
const Integer &other)
const
298 mpc_class t(get_prec());
299 mpc_set_z(t.get_mpc_t(), get_mpz_t(other.as_integer_class()), MPFR_RNDN);
300 mpc_mul(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
301 return make_rcp<const ComplexMPC>(
std::move(t));
307 RCP<const Number> ComplexMPC::mul(
const Rational &other)
const
309 mpc_class t(get_prec());
310 mpc_set_q(t.get_mpc_t(), get_mpq_t(other.as_rational_class()), MPFR_RNDN);
311 mpc_mul(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
312 return make_rcp<const ComplexMPC>(
std::move(t));
318 RCP<const Number> ComplexMPC::mul(
const Complex &other)
const
320 mpc_class t(get_prec());
321 mpc_set_q_q(t.get_mpc_t(), get_mpq_t(other.real_),
322 get_mpq_t(other.imaginary_), MPFR_RNDN);
323 mpc_mul(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
324 return make_rcp<const ComplexMPC>(
std::move(t));
330 RCP<const Number> ComplexMPC::mul(
const RealDouble &other)
const
332 mpc_class t(get_prec());
333 mpc_set_d(t.get_mpc_t(), other.i, MPFR_RNDN);
334 mpc_mul(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
335 return make_rcp<const ComplexMPC>(
std::move(t));
341 RCP<const Number> ComplexMPC::mul(
const ComplexDouble &other)
const
343 mpc_class t(get_prec());
344 mpc_set_d_d(t.get_mpc_t(), other.i.real(), other.i.imag(), MPFR_RNDN);
345 mpc_mul(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
346 return make_rcp<const ComplexMPC>(
std::move(t));
352 RCP<const Number> ComplexMPC::mul(
const RealMPFR &other)
const
354 mpc_class t(
std::max(get_prec(), other.get_prec()));
355 mpc_mul_fr(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpfr_t(), MPFR_RNDN);
356 return make_rcp<const ComplexMPC>(
std::move(t));
362 RCP<const Number> ComplexMPC::mul(
const ComplexMPC &other)
const
364 mpc_class t(
std::max(get_prec(), other.get_prec()));
365 mpc_mul(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpc_t(), MPFR_RNDN);
366 return make_rcp<const ComplexMPC>(
std::move(t));
372 RCP<const Number> ComplexMPC::div(
const Integer &other)
const
374 mpc_class t(get_prec());
375 mpc_set_z(t.get_mpc_t(), get_mpz_t(other.as_integer_class()), MPFR_RNDN);
376 mpc_div(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
377 return make_rcp<const ComplexMPC>(
std::move(t));
383 RCP<const Number> ComplexMPC::div(
const Rational &other)
const
385 mpc_class t(get_prec());
386 mpc_set_q(t.get_mpc_t(), get_mpq_t(other.as_rational_class()), MPFR_RNDN);
387 mpc_div(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
388 return make_rcp<const ComplexMPC>(
std::move(t));
394 RCP<const Number> ComplexMPC::div(
const Complex &other)
const
396 mpc_class t(get_prec());
397 mpc_set_q_q(t.get_mpc_t(), get_mpq_t(other.real_),
398 get_mpq_t(other.imaginary_), MPFR_RNDN);
399 mpc_div(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
400 return make_rcp<const ComplexMPC>(
std::move(t));
406 RCP<const Number> ComplexMPC::div(
const RealDouble &other)
const
408 mpc_class t(get_prec());
409 mpc_set_d(t.get_mpc_t(), other.i, MPFR_RNDN);
410 mpc_div(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
411 return make_rcp<const ComplexMPC>(
std::move(t));
417 RCP<const Number> ComplexMPC::div(
const ComplexDouble &other)
const
419 mpc_class t(get_prec());
420 mpc_set_d_d(t.get_mpc_t(), other.i.real(), other.i.imag(), MPFR_RNDN);
421 mpc_div(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
422 return make_rcp<const ComplexMPC>(
std::move(t));
428 RCP<const Number> ComplexMPC::div(
const RealMPFR &other)
const
430 mpc_class t(
std::max(get_prec(), other.get_prec()));
431 mpc_div_fr(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpfr_t(), MPFR_RNDN);
432 return make_rcp<const ComplexMPC>(
std::move(t));
438 RCP<const Number> ComplexMPC::div(
const ComplexMPC &other)
const
440 mpc_class t(
std::max(get_prec(), other.get_prec()));
441 mpc_div(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpc_t(), MPFR_RNDN);
442 return make_rcp<const ComplexMPC>(
std::move(t));
448 RCP<const Number> ComplexMPC::rdiv(
const Integer &other)
const
450 mpc_class t(get_prec());
451 mpc_set_z(t.get_mpc_t(), get_mpz_t(other.as_integer_class()), MPFR_RNDN);
452 mpc_div(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
453 return make_rcp<const ComplexMPC>(
std::move(t));
459 RCP<const Number> ComplexMPC::rdiv(
const Rational &other)
const
461 mpc_class t(get_prec());
462 mpc_set_q(t.get_mpc_t(), get_mpq_t(other.as_rational_class()), MPFR_RNDN);
463 mpc_div(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
464 return make_rcp<const ComplexMPC>(
std::move(t));
470 RCP<const Number> ComplexMPC::rdiv(
const Complex &other)
const
472 mpc_class t(get_prec());
473 mpc_set_q_q(t.get_mpc_t(), get_mpq_t(other.real_),
474 get_mpq_t(other.imaginary_), MPFR_RNDN);
475 mpc_div(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
476 return make_rcp<const ComplexMPC>(
std::move(t));
482 RCP<const Number> ComplexMPC::rdiv(
const RealDouble &other)
const
484 mpc_class t(get_prec());
485 mpc_set_d(t.get_mpc_t(), other.i, MPFR_RNDN);
486 mpc_div(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
487 return make_rcp<const ComplexMPC>(
std::move(t));
493 RCP<const Number> ComplexMPC::rdiv(
const ComplexDouble &other)
const
495 mpc_class t(get_prec());
496 mpc_set_d_d(t.get_mpc_t(), other.i.real(), other.i.imag(), MPFR_RNDN);
497 mpc_div(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
498 return make_rcp<const ComplexMPC>(
std::move(t));
504 RCP<const Number> ComplexMPC::rdiv(
const RealMPFR &other)
const
506 mpc_class t(
std::max(get_prec(), other.get_prec()));
507 mpc_fr_div(t.get_mpc_t(), other.i.get_mpfr_t(), i.get_mpc_t(), MPFR_RNDN);
508 return make_rcp<const ComplexMPC>(
std::move(t));
514 RCP<const Number> ComplexMPC::pow(
const Integer &other)
const
516 mpc_class t(get_prec());
517 mpc_set_z(t.get_mpc_t(), get_mpz_t(other.as_integer_class()), MPFR_RNDN);
518 mpc_pow(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
519 return make_rcp<const ComplexMPC>(
std::move(t));
525 RCP<const Number> ComplexMPC::pow(
const Rational &other)
const
527 mpc_class t(get_prec());
528 mpc_set_q(t.get_mpc_t(), get_mpq_t(other.as_rational_class()), MPFR_RNDN);
529 mpc_pow(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
530 return make_rcp<const ComplexMPC>(
std::move(t));
536 RCP<const Number> ComplexMPC::pow(
const Complex &other)
const
538 mpc_class t(get_prec());
539 mpc_set_q_q(t.get_mpc_t(), get_mpq_t(other.real_),
540 get_mpq_t(other.imaginary_), MPFR_RNDN);
541 mpc_pow(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
542 return make_rcp<const ComplexMPC>(
std::move(t));
548 RCP<const Number> ComplexMPC::pow(
const RealDouble &other)
const
550 mpc_class t(get_prec());
551 mpc_set_d(t.get_mpc_t(), other.i, MPFR_RNDN);
552 mpc_pow(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
553 return make_rcp<const ComplexMPC>(
std::move(t));
559 RCP<const Number> ComplexMPC::pow(
const ComplexDouble &other)
const
561 mpc_class t(get_prec());
562 mpc_set_d_d(t.get_mpc_t(), other.i.real(), other.i.imag(), MPFR_RNDN);
563 mpc_pow(t.get_mpc_t(), i.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
564 return make_rcp<const ComplexMPC>(
std::move(t));
570 RCP<const Number> ComplexMPC::pow(
const RealMPFR &other)
const
572 mpc_class t(
std::max(get_prec(), other.get_prec()));
573 mpc_pow_fr(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpfr_t(), MPFR_RNDN);
574 return make_rcp<const ComplexMPC>(
std::move(t));
580 RCP<const Number> ComplexMPC::pow(
const ComplexMPC &other)
const
582 mpc_class t(
std::max(get_prec(), other.get_prec()));
583 mpc_pow(t.get_mpc_t(), i.get_mpc_t(), other.i.get_mpc_t(), MPFR_RNDN);
584 return make_rcp<const ComplexMPC>(
std::move(t));
590 RCP<const Number> ComplexMPC::rpow(
const Integer &other)
const
592 mpc_class t(get_prec());
593 mpc_set_z(t.get_mpc_t(), get_mpz_t(other.as_integer_class()), MPFR_RNDN);
594 mpc_pow(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
595 return make_rcp<const ComplexMPC>(
std::move(t));
601 RCP<const Number> ComplexMPC::rpow(
const Rational &other)
const
603 mpc_class t(get_prec());
604 mpc_set_q(t.get_mpc_t(), get_mpq_t(other.as_rational_class()), MPFR_RNDN);
605 mpc_pow(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
606 return make_rcp<const ComplexMPC>(
std::move(t));
612 RCP<const Number> ComplexMPC::rpow(
const Complex &other)
const
614 mpc_class t(get_prec());
615 mpc_set_q_q(t.get_mpc_t(), get_mpq_t(other.real_),
616 get_mpq_t(other.imaginary_), MPFR_RNDN);
617 mpc_pow(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
618 return make_rcp<const ComplexMPC>(
std::move(t));
624 RCP<const Number> ComplexMPC::rpow(
const RealDouble &other)
const
626 mpc_class t(get_prec());
627 mpc_set_d(t.get_mpc_t(), other.i, MPFR_RNDN);
628 mpc_pow(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
629 return make_rcp<const ComplexMPC>(
std::move(t));
635 RCP<const Number> ComplexMPC::rpow(
const ComplexDouble &other)
const
637 mpc_class t(get_prec());
638 mpc_set_d_d(t.get_mpc_t(), other.i.real(), other.i.imag(), MPFR_RNDN);
639 mpc_pow(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
640 return make_rcp<const ComplexMPC>(
std::move(t));
646 RCP<const Number> ComplexMPC::rpow(
const RealMPFR &other)
const
648 mpc_class t(
std::max(get_prec(), other.get_prec()));
649 mpc_set_fr(t.get_mpc_t(), other.i.get_mpfr_t(), MPFR_RNDN);
650 mpc_pow(t.get_mpc_t(), t.get_mpc_t(), i.get_mpc_t(), MPFR_RNDN);
651 return make_rcp<const ComplexMPC>(
std::move(t));
655 class EvaluateMPC :
public Evaluate
657 RCP<const Basic>
sin(
const Basic &x)
const override
659 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
660 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
661 mpc_sin(t.get_mpc_t(),
662 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
666 RCP<const Basic>
cos(
const Basic &x)
const override
668 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
669 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
670 mpc_cos(t.get_mpc_t(),
671 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
675 RCP<const Basic>
tan(
const Basic &x)
const override
677 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
678 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
679 mpc_tan(t.get_mpc_t(),
680 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
684 RCP<const Basic>
cot(
const Basic &x)
const override
686 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
687 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
688 mpc_tan(t.get_mpc_t(),
689 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
691 mpc_ui_div(t.get_mpc_t(), 1, t.get_mpc_t(), MPFR_RNDN);
694 RCP<const Basic>
sec(
const Basic &x)
const override
696 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
697 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
698 mpc_cos(t.get_mpc_t(),
699 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
701 mpc_ui_div(t.get_mpc_t(), 1, t.get_mpc_t(), MPFR_RNDN);
704 RCP<const Basic>
csc(
const Basic &x)
const override
706 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
707 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
708 mpc_sin(t.get_mpc_t(),
709 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
711 mpc_ui_div(t.get_mpc_t(), 1, t.get_mpc_t(), MPFR_RNDN);
714 RCP<const Basic>
asin(
const Basic &x)
const override
716 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
717 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
718 mpc_asin(t.get_mpc_t(),
719 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
723 RCP<const Basic>
acos(
const Basic &x)
const override
725 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
726 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
727 mpc_acos(t.get_mpc_t(),
728 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
732 RCP<const Basic>
atan(
const Basic &x)
const override
734 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
735 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
736 mpc_atan(t.get_mpc_t(),
737 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
741 RCP<const Basic>
acot(
const Basic &x)
const override
743 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
744 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
745 mpc_ui_div(t.get_mpc_t(), 1,
746 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
748 mpc_atan(t.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
751 RCP<const Basic>
asec(
const Basic &x)
const override
753 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
754 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
755 mpc_ui_div(t.get_mpc_t(), 1,
756 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
758 mpc_acos(t.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
761 RCP<const Basic>
acsc(
const Basic &x)
const override
763 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
764 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
765 mpc_ui_div(t.get_mpc_t(), 1,
766 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
768 mpc_asin(t.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
771 RCP<const Basic>
sinh(
const Basic &x)
const override
773 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
774 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
775 mpc_sinh(t.get_mpc_t(),
776 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
780 RCP<const Basic>
csch(
const Basic &x)
const override
782 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
783 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
784 mpc_sinh(t.get_mpc_t(),
785 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
787 mpc_ui_div(t.get_mpc_t(), 1, t.get_mpc_t(), MPFR_RNDN);
790 RCP<const Basic>
cosh(
const Basic &x)
const override
792 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
793 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
794 mpc_cosh(t.get_mpc_t(),
795 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
799 RCP<const Basic>
sech(
const Basic &x)
const override
801 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
802 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
803 mpc_cosh(t.get_mpc_t(),
804 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
806 mpc_ui_div(t.get_mpc_t(), 1, t.get_mpc_t(), MPFR_RNDN);
809 RCP<const Basic>
tanh(
const Basic &x)
const override
811 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
812 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
813 mpc_tanh(t.get_mpc_t(),
814 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
818 RCP<const Basic>
coth(
const Basic &x)
const override
820 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
821 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
822 mpc_tanh(t.get_mpc_t(),
823 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
825 mpc_ui_div(t.get_mpc_t(), 1, t.get_mpc_t(), MPFR_RNDN);
828 RCP<const Basic>
asinh(
const Basic &x)
const override
830 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
831 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
832 mpc_asinh(t.get_mpc_t(),
833 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
837 RCP<const Basic>
acsch(
const Basic &x)
const override
839 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
840 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
841 mpc_ui_div(t.get_mpc_t(), 1,
842 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
844 mpc_asinh(t.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
847 RCP<const Basic>
acosh(
const Basic &x)
const override
849 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
850 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
851 mpc_acosh(t.get_mpc_t(),
852 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
856 RCP<const Basic>
atanh(
const Basic &x)
const override
858 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
859 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
860 mpc_atanh(t.get_mpc_t(),
861 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
865 RCP<const Basic>
acoth(
const Basic &x)
const override
867 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
868 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
869 mpc_ui_div(t.get_mpc_t(), 1,
870 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
872 mpc_atanh(t.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
875 RCP<const Basic>
asech(
const Basic &x)
const override
877 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
878 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
879 mpc_ui_div(t.get_mpc_t(), 1,
880 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
882 mpc_acosh(t.get_mpc_t(), t.get_mpc_t(), MPFR_RNDN);
885 RCP<const Basic>
log(
const Basic &x)
const override
887 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
888 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
889 mpc_log(t.get_mpc_t(),
890 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
894 RCP<const Basic>
abs(
const Basic &x)
const override
896 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
897 mpfr_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
898 mpc_abs(t.get_mpfr_t(),
899 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
903 RCP<const Basic>
gamma(Basic
const &aConst)
const override
905 throw NotImplementedError(
"Not Implemented.");
907 RCP<const Basic>
exp(
const Basic &x)
const override
909 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
910 mpc_class t(down_cast<const ComplexMPC &>(x).as_mpc().get_prec());
911 mpc_exp(t.get_mpc_t(),
912 down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t(),
916 RCP<const Basic>
floor(
const Basic &x)
const override
918 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
919 integer_class re, im;
922 mpc_realref(down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t()),
926 mpc_imagref(down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t()),
933 RCP<const Basic>
ceiling(
const Basic &x)
const override
935 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
936 integer_class re, im;
939 mpc_realref(down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t()),
943 mpc_imagref(down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t()),
950 RCP<const Basic>
truncate(
const Basic &x)
const override
952 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
953 integer_class re, im;
956 mpc_realref(down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t()),
960 mpc_imagref(down_cast<const ComplexMPC &>(x).as_mpc().get_mpc_t()),
967 RCP<const Basic>
erf(
const Basic &x)
const override
969 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
970 throw NotImplementedError(
"erf is not implemented in mpc");
972 RCP<const Basic>
erfc(
const Basic &x)
const override
974 SYMENGINE_ASSERT(is_a<ComplexMPC>(x))
975 throw NotImplementedError(
"erfc is not implemented in mpc");
979 Evaluate &ComplexMPC::get_eval()
const
981 static EvaluateMPC evaluate_mpc;
Main namespace for SymEngine package.
std::enable_if< std::is_integral< T >::value, RCP< const Integer > >::type integer(T i)
RCP< const Basic > sec(const RCP< const Basic > &arg)
Canonicalize Sec:
RCP< const Basic > coth(const RCP< const Basic > &arg)
Canonicalize Coth:
RCP< const Basic > ceiling(const RCP< const Basic > &arg)
Canonicalize Ceiling:
RCP< const Basic > abs(const RCP< const Basic > &arg)
Canonicalize Abs:
RCP< const Basic > acsc(const RCP< const Basic > &arg)
Canonicalize ACsc:
RCP< const Basic > sech(const RCP< const Basic > &arg)
Canonicalize Sech:
RCP< const Basic > gamma(const RCP< const Basic > &arg)
Canonicalize Gamma:
RCP< const Basic > sub(const RCP< const Basic > &a, const RCP< const Basic > &b)
Substracts b from a.
RCP< const Basic > acoth(const RCP< const Basic > &arg)
Canonicalize ACoth:
RCP< const Basic > asec(const RCP< const Basic > &arg)
Canonicalize ASec:
RCP< const Basic > acsch(const RCP< const Basic > &arg)
Canonicalize ACsch:
RCP< const Basic > cot(const RCP< const Basic > &arg)
Canonicalize Cot:
RCP< const Basic > truncate(const RCP< const Basic > &arg)
Canonicalize Truncate:
RCP< const Basic > csc(const RCP< const Basic > &arg)
Canonicalize Csc:
RCP< const Basic > add(const RCP< const Basic > &a, const RCP< const Basic > &b)
Adds two objects (safely).
RCP< const Basic > csch(const RCP< const Basic > &arg)
Canonicalize Csch:
void hash_combine_impl(hash_t &seed, const T &v, typename std::enable_if< std::is_base_of< Basic, T >::value >::type *=nullptr)
Templatised version to combine hash.
RCP< const Basic > asech(const RCP< const Basic > &arg)
Canonicalize ASech:
RCP< const Basic > acot(const RCP< const Basic > &arg)
Canonicalize ACot: