if (inf == info_flags::polynomial)
return true;
if (inf == info_flags::real)
- return domain == domain::real;
+ return domain==domain::real || domain==domain::positive ;
+ if (inf==info_flags::positive || inf==info_flags::nonnegative)
+ return domain == domain::positive;
else
return inherited::info(inf);
}
ex constant::conjugate() const
{
- if ( domain == domain::real )
+ if ( domain==domain::real || domain==domain::positive )
return *this;
return conjugate_function(*this).hold();
}
ex constant::real_part() const
{
- if ( domain == domain::real )
+ if ( domain==domain::real || domain==domain::positive )
return *this;
return real_part_function(*this).hold();
}
ex constant::imag_part() const
{
- if ( domain == domain::real )
+ if ( domain==domain::real || domain==domain::positive )
return 0;
return imag_part_function(*this).hold();
}
//////////
/** Pi. (3.14159...) Diverts straight into CLN for evalf(). */
-const constant Pi("Pi", PiEvalf, "\\pi", domain::real);
+const constant Pi("Pi", PiEvalf, "\\pi", domain::positive);
/** Euler's constant. (0.57721...) Sometimes called Euler-Mascheroni constant.
* Diverts straight into CLN for evalf(). */
-const constant Euler("Euler", EulerEvalf, "\\gamma_E", domain::real);
+const constant Euler("Euler", EulerEvalf, "\\gamma_E", domain::positive);
/** Catalan's constant. (0.91597...) Diverts straight into CLN for evalf(). */
-const constant Catalan("Catalan", CatalanEvalf, "G", domain::real);
+const constant Catalan("Catalan", CatalanEvalf, "G", domain::positive);
} // namespace GiNaC
{
if (is_exactly_a<numeric>(arg))
return abs(ex_to<numeric>(arg));
- else
- return abs(arg).hold();
+
+ if (arg.info(info_flags::nonnegative))
+ return arg;
+
+ if (is_ex_the_function(arg, abs))
+ return arg;
+
+ return abs(arg).hold();
}
static void abs_print_latex(const ex & arg, const print_context & c)
inf == info_flags::rational_function)
return true;
if (inf == info_flags::real)
- return domain == domain::real;
+ return domain==domain::real || domain==domain::positive;
+ if (inf == info_flags::nonnegative)
+ return domain == domain::positive;
else
return inherited::info(inf);
}
ex symbol::real_part() const
{
- if (domain == domain::real)
+ if (domain==domain::real || domain==domain::positive)
return *this;
return real_part_function(*this).hold();
}
ex symbol::imag_part() const
{
- if (domain == domain::real)
+ if (domain==domain::real || domain==domain::positive)
return 0;
return imag_part_function(*this).hold();
}
/** Specialization of is_exactly_a<realsymbol>(obj) for realsymbol objects. */
template<> inline bool is_exactly_a<realsymbol>(const basic & obj)
{
- return (obj.tinfo() == &symbol::tinfo_static) && (static_cast<const symbol &>(obj).get_domain() == domain::real);
+ if (obj.tinfo() != &symbol::tinfo_static)
+ return false;
+ unsigned domain = static_cast<const symbol &>(obj).get_domain();
+ return domain==domain::real || domain==domain::positive;
}
// wrapper functions around member functions