/// <summary> /// Parses the datastructure created by the parse method. /// </summary> /// <remarks> /// This is where the actual evaluation of the expression is made, /// the Node tree structure created by the parse method is recursed and evaluated /// to a double value. /// </remarks> /// <param name="tree">A Node representing a tree datastructure</param> /// <returns>A double value</returns> private double toValue( Node tree ) { Node arg1, arg2; double val; String op, tmp; if( tree.getType() == Node.TYPE_CONSTANT ) { return( tree.getValue() ); } else if( tree.getType() == Node.TYPE_VARIABLE ) { tmp = tree.getVariable(); // check if PI, Euler....etc if( spconst.ContainsKey( tmp ) ) { return( (double)spconst[ tmp ] ); } // normal variable, get value return GetVariable( tmp ); // if( isConstant( tmp ) ) // { // return( Double.Parse( tmp ) ); // } // else // { // Syntax( tmp ); // return( toValue( parse( putMult( parseE( tmp ) ) ) ) ); // } } op = tree.getOperator(); arg1 = tree.arg1(); if( tree.arguments() == 2 ) { arg2 = tree.arg2(); if( op.Equals( "+" ) ) return( toValue(arg1) + toValue(arg2)); else if( op.Equals( "-" ) ) return( toValue(arg1) - toValue(arg2)); else if( op.Equals( "*" ) ) return( toValue(arg1) * toValue(arg2)); else if( op.Equals( "/" ) ) return( toValue(arg1) / toValue(arg2)); else if( op.Equals( "^" ) ) return( Math.Pow(toValue(arg1),toValue(arg2))); else if( op.Equals( "log" ) ) return( Math.Log(toValue(arg2)) / Math.Log(toValue(arg1)) ); else if( op.Equals( "%" ) ) return( toValue(arg1) % toValue(arg2)); else if( op.Equals( "==" ) ) return( toValue(arg1) == toValue(arg2) ? 1.0 : 0.0 ); else if( op.Equals( "!=" ) ) return( toValue(arg1) != toValue(arg2) ? 1.0 : 0.0 ); else if( op.Equals( "<" ) ) return( toValue(arg1) < toValue(arg2) ? 1.0 : 0.0 ); else if( op.Equals( ">" ) ) return( toValue(arg1) > toValue(arg2) ? 1.0 : 0.0 ); else if( op.Equals( "&&" ) ) return( ( toValue(arg1) == 1.0 ) && ( toValue(arg2) == 1.0 ) ? 1.0 : 0.0 ); else if( op.Equals( "||" ) ) return( ( toValue(arg1) == 1.0 ) || ( toValue(arg2) == 1.0 ) ? 1.0 : 0.0 ); else if( op.Equals( ">=" ) ) return( toValue(arg1) >= toValue(arg2) ? 1.0 : 0.0 ); else if( op.Equals( "<=" ) ) return( toValue(arg1) <= toValue(arg2) ? 1.0 : 0.0 ); } else { if( op.Equals( "sqrt" ) ) return( Math.Sqrt(toValue(arg1))); else if( op.Equals( "sin" ) ) return( Math.Sin(toValue(arg1))); else if( op.Equals( "cos" ) ) return( Math.Cos(toValue(arg1))); else if( op.Equals( "tan" ) ) return( Math.Tan(toValue(arg1))); else if( op.Equals( "asin" ) ) return( Math.Asin(toValue(arg1))); else if( op.Equals( "acos" ) ) return( Math.Acos(toValue(arg1))); else if( op.Equals( "atan" ) ) return( Math.Atan(toValue(arg1))); else if( op.Equals( "ln" ) ) return( Math.Log(toValue(arg1))); else if( op.Equals( "exp" ) ) return( Math.Exp(toValue(arg1))); else if( op.Equals( "cotan" ) ) return(1 / Math.Tan(toValue(arg1))); else if( op.Equals( "acotan" ) ) return( Math.PI / 2 - Math.Atan(toValue(arg1))); else if( op.Equals( "ceil" ) ) return((double)Math.Ceiling(toValue(arg1))); else if( op.Equals( "round" ) ) return((double)Math.Round(toValue(arg1))); else if( op.Equals( "floor" ) ) return((double)Math.Floor(toValue(arg1))); else if( op.Equals( "fac" ) ) return(fac(toValue(arg1))); else if( op.Equals( "abs" ) ) return( Math.Abs(toValue(arg1))); else if( op.Equals( "fpart" ) ) return( fpart(toValue(arg1)) ); else if( op.Equals( "sfac" ) ) return( sfac(toValue(arg1))); else if( op.Equals( "sinh" ) ) { val = toValue(arg1); return( ( Math.Exp(val) - ( 1 / Math.Exp(val))) / 2); } else if( op.Equals( "cosh" ) ) { val = toValue(arg1); return( ( Math.Exp(val) + ( 1 / Math.Exp(val))) / 2); } else if( op.Equals( "tanh" ) ) { val = toValue(arg1); return( ( ( Math.Exp(val) - ( 1 / Math.Exp(val))) / 2) / ((Math.Exp(val) + ( 1 / Math.Exp(val))) / 2) ); } else if( op.Equals( "!" ) ) { return( ( ! ( toValue(arg1) == 1.0 ) ) ? 1.0 : 0.0 ); } } throw new System.Exception( "Unknown operator" ); }