// Returns char identifying sign resulting from multiplication or division of two numbers // // Returns: // char '+' or '-' char Exponent::calcSign(tr1::shared_ptr<AbstractNumber> number){ if(sign == number->getSign()){ return '+'; } else{ return '-'; } }
// Adds number to this and returns the sum // // Parameters: // shared_ptr<AbstractNumber> number number being added // // Returns: // shared_ptr<AbstractNumber> resulting sum of addition tr1::shared_ptr<AbstractNumber> Exponent::add(tr1::shared_ptr<AbstractNumber> number){ // Checks for cancellation number = number->simplify(); if(abs(toDouble() - number->toDouble()) < 0.000001 && this->getSign() != number->getSign()){ tr1::shared_ptr<AbstractNumber> r(new SmartInteger(0)); return r; } // Checks for duplication/simplification else if(abs(toDouble() - number->toDouble()) < 0.000001 && this->getSign() == number->getSign()){ vector< tr1::shared_ptr<AbstractNumber> > MultVector; tr1::shared_ptr<AbstractNumber> i(new SmartInteger(2)); MultVector.push_back(i); tr1::shared_ptr<AbstractNumber> me(new Exponent(base, power, sign)); MultVector.push_back(me); tr1::shared_ptr<AbstractNumber> r(new MultExpression(MultVector, '+')); return r; } //Can't tell if they add or not else if(number->getName() == "SumExpression" || number->getName() == "MultExpression"){ return number->add(shared_from_this()); } // Duplication necessary for simplification // Assuming number is in simplest form // No simplification possible else{ vector< tr1::shared_ptr<AbstractNumber> > SumVector; tr1::shared_ptr<AbstractNumber> me(new Exponent(base, power, sign)); SumVector.push_back(me); SumVector.push_back(number); tr1::shared_ptr<AbstractNumber> r(new SumExpression(SumVector)); return r; } }
tr1::shared_ptr<AbstractNumber> E::divide(tr1::shared_ptr<AbstractNumber>number){ char newSign = '-'; if (getSign() == number->getSign()) { newSign = '+'; } if (number -> getName() == "E") { if (newSign == '+') { tr1::shared_ptr<AbstractNumber> output(new SmartInteger(1)); return output; } else { tr1::shared_ptr<AbstractNumber> output(new SmartInteger(-1)); return output; } } else if (number -> getName() == "Exponent") { tr1::shared_ptr<Exponent> numExp = tr1::static_pointer_cast<Exponent>(number); if (numExp -> getValue("base") -> getName() == "E") { tr1::shared_ptr<AbstractNumber> num(new SmartInteger(1)); tr1::shared_ptr<AbstractNumber> exp = number->getValue("power"); tr1::shared_ptr<AbstractNumber> exp2(new SmartInteger(-1)); tr1::shared_ptr<AbstractNumber> me(new E()); tr1::shared_ptr<AbstractNumber> ans2(new Exponent(me, exp -> add(exp2), newSign)); tr1::shared_ptr<AbstractNumber> output2(new MultExpression(num, ans2, '+')); return output2; } } else if(number->getName() == "MultExpression") { tr1::shared_ptr<MultExpression> MultE = tr1::static_pointer_cast<MultExpression>(number); vector<tr1::shared_ptr<AbstractNumber> > MultENum = MultE->getNumerator(); vector<tr1::shared_ptr<AbstractNumber> > MultEDem = MultE->getDenominator(); if (MultEDem.size() == 0) { tr1::shared_ptr<AbstractNumber> one(new SmartInteger(1)); MultEDem.push_back(one); } tr1::shared_ptr<AbstractNumber> reversedMultE(new MultExpression(MultEDem, MultENum, number->getSign())); return reversedMultE->multiply(shared_from_this()); } tr1::shared_ptr<AbstractNumber> output2(new MultExpression(shared_from_this(), number, newSign)); return output2; }
tr1::shared_ptr<AbstractNumber> E::multiply(tr1::shared_ptr<AbstractNumber>number){ char newSign = '-'; if (getSign() == number->getSign()) { newSign = '+'; } if(number -> getName() == "E") { if (newSign == '+') { tr1::shared_ptr<AbstractNumber> exp(new SmartInteger(2)); tr1::shared_ptr<AbstractNumber> me(new E()); tr1::shared_ptr<AbstractNumber> ans(new Exponent(me, exp)); return ans; } else { tr1::shared_ptr<AbstractNumber> exp(new SmartInteger(-2)); tr1::shared_ptr<AbstractNumber> me(new E()); tr1::shared_ptr<AbstractNumber> ans(new Exponent(me, exp)); return ans; } } else if (number -> getName() == "Exponent") { tr1::shared_ptr<Exponent> numExp = tr1::static_pointer_cast<Exponent>(number); if (numExp -> getValue("base") -> getName() == "E") { tr1::shared_ptr<AbstractNumber> exp = numExp->getValue("power"); tr1::shared_ptr<AbstractNumber> exp2(new SmartInteger(1)); tr1::shared_ptr<AbstractNumber> me(new E()); tr1::shared_ptr<AbstractNumber> ans2(new Exponent(me, exp -> add(exp2), newSign)); return ans2; } } else if (number->getName() == "Radical") { if (abs(number->getValue("value")->toDouble() - toDouble()) < 0.000001 ) { tr1::shared_ptr<AbstractNumber> one(new SmartInteger(1)); tr1::shared_ptr<AbstractNumber> invertedRoot(new MultExpression(one, number->getValue("root"), '+')); tr1::shared_ptr<AbstractNumber> me(new E()); tr1::shared_ptr<AbstractNumber> output(new Exponent(me, invertedRoot->add(one), newSign)); return output; } else { vector<tr1::shared_ptr<AbstractNumber> > M; M.push_back(number); M.push_back(shared_from_this()); tr1::shared_ptr<AbstractNumber> ans3(new MultExpression(M, '+')); return ans3; } } else if(number->getName() == "MultExpression") { return number->multiply(shared_from_this()); } vector<tr1::shared_ptr<AbstractNumber> > M; M.push_back(number); M.push_back(shared_from_this()); tr1::shared_ptr<AbstractNumber> ans3(new MultExpression(M, '+')); return ans3; }