public void Clone_TanExpression() { //Arrange var expected = new TanExpression(new NumberExpression(0), new Complex(3, 2)); //Act var actual = (TanExpression)expected.Clone(); //Assert Assert.IsTrue(!Object.ReferenceEquals(actual, expected)); Assert.IsTrue(!Object.ReferenceEquals(actual.Argument, expected.Argument)); Assert.AreEqual(expected.Count.Re.Numerator, actual.Count.Re.Numerator); Assert.AreEqual(expected.Count.Re.Denominator, actual.Count.Re.Denominator); Assert.AreEqual(expected.Count.Im.Numerator, actual.Count.Im.Numerator); Assert.AreEqual(expected.Count.Im.Denominator, actual.Count.Im.Denominator); }
// Syntax analysis of reverse polish notation expression private Stack <double> SyntaxAnalysisRPN(Stack <double> stack, string token) { // if it's operand then just push to stack if (token[0] == NumberMarker[0]) { stack.Push(double.Parse(token.Remove(0, 1))); } // otherwise apply operator or funtion to elements in stack else if (NumberOfArguments(token) == 1) { double argument = stack.Pop(); NumExpression arg = new NumExpression(argument); if (!isRadians) { argument = argument * Math.PI / 180; // Convert value to degree } NumExpression trigArg = new NumExpression(argument); double result; switch (token) { case UnaryPlus: result = arg.evaluate(); break; case UnaryMinus: NegateExpresion neg = new NegateExpresion(arg); result = neg.evaluate(); break; case Sqrt: SqrtExpression sqrt = new SqrtExpression(arg); result = sqrt.evaluate(); break; case Log: LogarithmExpression log = new LogarithmExpression(arg); result = log.evaluate(); break; case Ln: LnExpression ln = new LnExpression(arg); result = ln.evaluate(); break; case Sin: SinExpression sin = new SinExpression(trigArg); result = sin.evaluate(); break; case Cos: CosExpression cos = new CosExpression(trigArg); result = cos.evaluate(); break; case Tan: TanExpression tan = new TanExpression(trigArg); result = tan.evaluate(); break; case Csc: CscExpression csc = new CscExpression(trigArg); result = csc.evaluate(); break; case Sec: SecExpression sec = new SecExpression(trigArg); result = sec.evaluate(); break; case Cot: CotExpression cot = new CotExpression(trigArg); result = cot.evaluate(); break; default: throw new ArgumentException("Unknown operator"); } stack.Push(result); } else { // otherwise operator's number of arguments equal to 2 double argument2 = stack.Pop(); double argument1 = stack.Pop(); NumExpression arg1 = new NumExpression(argument1); NumExpression arg2 = new NumExpression(argument2); double result; switch (token) { case Plus: AdditionExpression add = new AdditionExpression(arg1, arg2); result = add.evaluate(); break; case Minus: MinusExpression minus = new MinusExpression(arg1, arg2); result = minus.evaluate(); break; case Multiply: MultiplyExpression multiply = new MultiplyExpression(arg1, arg2); result = multiply.evaluate(); break; case Divide: if (argument2 == 0) { throw new DivideByZeroException("Second argument is zero"); } DivideExpression divide = new DivideExpression(arg1, arg2); result = divide.evaluate(); break; case Mod: ModExpression mod = new ModExpression(arg1, arg2); result = mod.evaluate(); break; case Exponent: ExpononetExpression exp = new ExpononetExpression(arg1, arg2); result = exp.evaluate(); break; default: throw new ArgumentException("Unknown operator"); } stack.Push(result); } return(stack); }
public override bool Visit(TanExpression tanExpression) => this.VisitInstrinsicsCore(tanExpression, "tan");
public override LE.Expression Visit(TanExpression tanExpression) => this.VisitIntrinsicsCore(tanExpression, Intrinsics.Tan);