2#include <symengine/complex_double.h>
6#include <symengine/symengine_exception.h>
7#include <symengine/complex_mpc.h>
16 SYMENGINE_ASSIGN_TYPEID()
23 SYMENGINE_ASSIGN_TYPEID()
24 _direction = inf.get_direction();
35 SYMENGINE_ASSERT(
val >= -1 &&
val <= 1)
45 if (
num->is_one() ||
num->is_zero() ||
num->is_minus_one())
62 return eq(*_direction, *(s.get_direction()));
72 return _direction->compare(*(s.get_direction()));
75bool Infty::is_unsigned_infinity()
const
77 return _direction->is_zero();
80bool Infty::is_positive_infinity()
const
82 return _direction->is_positive();
85bool Infty::is_negative_infinity()
const
87 return _direction->is_negative();
92 if (is_positive_infinity()
or is_negative_infinity()) {
93 return infty(_direction);
105 if (
not eq(*s.get_direction(), *_direction))
107 else if (is_unsigned_infinity())
117 "Multiplication with Complex not implemented");
123 if (
other.is_positive())
125 else if (
other.is_negative())
137 if (
other.is_positive())
139 else if (
other.is_zero())
142 return infty(this->_direction->mul(*minus_one));
149 if (is_positive_infinity()) {
150 if (
other.is_negative()) {
152 }
else if (
other.is_positive()) {
157 }
else if (is_negative_infinity()) {
160 if (
other.is_positive()) {
162 }
else if (
other.is_negative()) {
170 "Raising to the Complex powers not yet implemented");
172 if (
other.is_negative()) {
174 }
else if (
other.is_zero()) {
177 if (is_positive_infinity()) {
179 }
else if (is_negative_infinity()) {
181 "Positive Real powers not yet "
190RCP<const Number> Infty::rpow(
const Number &
other)
const
194 "Raising Complex powers to Infty not yet implemented");
196 if (
other.is_negative()) {
198 "powers not yet implemented");
199 }
else if (
other.is_zero()) {
200 throw SymEngineException(
"Indeterminate Expression: `0 ** +- "
201 "unsigned Infty` encountered");
206 }
else if (is_positive_infinity()) {
207 if (s.sub(*one)->is_negative()) {
212 }
else if (is_negative_infinity()) {
213 if (s.sub(*one)->is_negative()) {
219 throw SymEngineException(
"Indeterminate Expression: `Positive "
220 "Real Number ** unsigned Infty` "
234 RCP<const Basic> sin(
const Basic &x)
const override
237 throw DomainError(
"sin is not defined for infinite values");
239 RCP<const Basic> cos(
const Basic &x)
const override
242 throw DomainError(
"cos is not defined for infinite values");
244 RCP<const Basic> tan(
const Basic &x)
const override
247 throw DomainError(
"tan is not defined for infinite values");
249 RCP<const Basic> cot(
const Basic &x)
const override
252 throw DomainError(
"cot is not defined for infinite values");
254 RCP<const Basic> sec(
const Basic &x)
const override
257 throw DomainError(
"sec is not defined for infinite values");
259 RCP<const Basic> csc(
const Basic &x)
const override
262 throw DomainError(
"csc is not defined for infinite values");
264 RCP<const Basic> asin(
const Basic &x)
const override
267 throw DomainError(
"asin is not defined for infinite values");
269 RCP<const Basic> acos(
const Basic &x)
const override
272 throw DomainError(
"acos is not defined for infinite values");
274 RCP<const Basic> acsc(
const Basic &x)
const override
277 throw DomainError(
"acsc is not defined for infinite values");
279 RCP<const Basic> asec(
const Basic &x)
const override
282 throw DomainError(
"asec is not defined for infinite values");
284 RCP<const Basic> atan(
const Basic &x)
const override
293 throw DomainError(
"atan is not defined for Complex Infinity");
296 RCP<const Basic> acot(
const Basic &x)
const override
303 throw DomainError(
"acot is not defined for Complex Infinity");
306 RCP<const Basic> sinh(
const Basic &x)
const override
311 return infty(s.get_direction());
313 throw DomainError(
"sinh is not defined for Complex Infinity");
316 RCP<const Basic> csch(
const Basic &x)
const override
323 throw DomainError(
"csch is not defined for Complex Infinity");
326 RCP<const Basic> cosh(
const Basic &x)
const override
333 throw DomainError(
"cosh is not defined for Complex Infinity");
336 RCP<const Basic> sech(
const Basic &x)
const override
343 throw DomainError(
"sech is not defined for Complex Infinity");
346 RCP<const Basic> tanh(
const Basic &x)
const override
355 throw DomainError(
"tanh is not defined for Complex Infinity");
358 RCP<const Basic> coth(
const Basic &x)
const override
367 throw DomainError(
"coth is not defined for Complex Infinity");
370 RCP<const Basic> asinh(
const Basic &x)
const override
375 return infty(s.get_direction());
377 throw DomainError(
"asinh is not defined for Complex Infinity");
380 RCP<const Basic> acosh(
const Basic &x)
const override
387 throw DomainError(
"acosh is not defined for Complex Infinity");
390 RCP<const Basic> acsch(
const Basic &x)
const override
397 throw DomainError(
"acsch is not defined for Complex Infinity");
400 RCP<const Basic> asech(
const Basic &x)
const override
407 throw DomainError(
"asech is not defined for Complex Infinity");
410 RCP<const Basic> atanh(
const Basic &x)
const override
419 throw DomainError(
"atanh is not defined for Complex Infinity");
422 RCP<const Basic> acoth(
const Basic &x)
const override
429 throw DomainError(
"acoth is not defined for Complex Infinity");
432 RCP<const Basic> abs(
const Basic &x)
const override
437 RCP<const Basic> log(
const Basic &x)
const override
447 RCP<const Basic> gamma(
const Basic &x)
const override
457 RCP<const Basic> exp(
const Basic &x)
const override
466 throw DomainError(
"exp is not defined for Complex Infinity");
469 RCP<const Basic> floor(
const Basic &x)
const override
478 throw DomainError(
"floor is not defined for Complex Infinity");
481 RCP<const Basic> ceiling(
const Basic &x)
const override
490 throw DomainError(
"ceiling is not defined for Complex Infinity");
493 RCP<const Basic> truncate(
const Basic &x)
const override
502 throw DomainError(
"truncate is not defined for Complex Infinity");
505 RCP<const Basic> erf(
const Basic &x)
const override
514 throw DomainError(
"erf is not defined for Complex Infinity");
517 RCP<const Basic> erfc(
const Basic &x)
const override
526 throw DomainError(
"erfc is not defined for Complex Infinity");
The lowest unit of symbolic representation.
A class that will evaluate functions numerically.
RCP< const Number > pow(const Number &other) const override
Power.
bool __eq__(const Basic &o) const override
RCP< const Number > div(const Number &other) const override
Division.
bool is_negative() const override
hash_t __hash__() const override
bool is_canonical(const RCP< const Number > &num) const
Canonical when the direction is -1, 0 or 1.
Evaluate & get_eval() const override
Get Evaluate singleton to evaluate numerically.
bool is_positive() const override
static RCP< const Infty > from_int(const int val)
Constructs Infty using sign of val
RCP< const Number > mul(const Number &other) const override
Multiplication.
RCP< const Basic > conjugate() const override
int compare(const Basic &o) const override
Infty(const RCP< const Number > &direction)
Constructs Infty using the sign of _direction
RCP< const Number > add(const Number &other) const override
Addition.
Main namespace for SymEngine package.
RCP< const Basic > div(const RCP< const Basic > &a, const RCP< const Basic > &b)
Division.
bool eq(const Basic &a, const Basic &b)
Checks equality for a and b
void hash_combine(hash_t &seed, const T &v)
RCP< const Basic > mul(const RCP< const Basic > &a, const RCP< const Basic > &b)
Multiplication.
bool is_a_Complex(const Basic &b)
std::enable_if< std::is_integral< T >::value, RCP< constInteger > >::type integer(T i)