RCP<const Basic> log(const RCP<const Basic> &arg) { if (eq(*arg, *zero)) { throw NotImplementedError( "log(0) is complex infinity. Yet to be implemented"); } if (eq(*arg, *one)) return zero; if (eq(*arg, *E)) return one; if (is_a_Number(*arg)) { RCP<const Number> _arg = rcp_static_cast<const Number>(arg); if (not _arg->is_exact()) { return _arg->get_eval().log(*_arg); } else if (_arg->is_negative()) { throw NotImplementedError( "Imaginary Result. Yet to be implemented"); } } if (is_a<Rational>(*arg)) { RCP<const Integer> num, den; get_num_den(static_cast<const Rational &>(*arg), outArg(num), outArg(den)); return sub(log(num), log(den)); } return make_rcp<const Log>(arg); }
RCP<const Basic> log(const RCP<const Basic> &arg) { if (eq(arg, zero)) { throw std::runtime_error("log(0) is complex infinity. Yet to be implemented"); } if (eq(arg, one)) return zero; if (eq(arg, E)) return one; if (is_a_Number(*arg) && rcp_static_cast<const Number>(arg)->is_negative()) { throw std::runtime_error("Imaginary Result. Yet to be implemented"); } if (is_a<Rational>(*arg)) { RCP<const Integer> num, den; get_num_den(rcp_static_cast<const Rational>(arg), outArg(num), outArg(den)); return sub(log(num), log(den)); } return rcp(new Log(arg)); }