* Implementation of GiNaC's initially known functions. */
/*
- * GiNaC Copyright (C) 1999-2005 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
{
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)
// syntax checks
if (!eqns.info(info_flags::list)) {
- throw(std::invalid_argument("lsolve(): 1st argument must be a list"));
+ throw(std::invalid_argument("lsolve(): 1st argument must be a list or an equation"));
}
for (size_t i=0; i<eqns.nops(); i++) {
if (!eqns.op(i).info(info_flags::relation_equal)) {
}
}
if (!symbols.info(info_flags::list)) {
- throw(std::invalid_argument("lsolve(): 2nd argument must be a list"));
+ throw(std::invalid_argument("lsolve(): 2nd argument must be a list or a symbol"));
}
for (size_t i=0; i<symbols.nops(); i++) {
if (!symbols.op(i).info(info_flags::symbol)) {