private IExpression SimplifyDiv(Div div) { // 0 / x if (div.Left.Equals(zero) && !div.Right.Equals(zero)) return zero; // x / 0 if (div.Right.Equals(zero) && !div.Left.Equals(zero)) throw new DivideByZeroException(); // x / 1 if (div.Right.Equals(one)) return div.Left; if (div.Left is Number && div.Right is Number) return new Number((double)div.Calculate()); // (2 * x) / 2 // (x * 2) / 2 if (div.Left is Mul && div.Right is Number) { var bracketMul = div.Left as Mul; var firstNumber = div.Right as Number; if (bracketMul.Left is Number) { var secondNumber = bracketMul.Left as Number; var result = new Div(bracketMul.Right, new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate())); return _Simplify(result); } if (bracketMul.Right is Number) { var secondNumber = bracketMul.Right as Number; var result = new Div(bracketMul.Left, new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate())); return _Simplify(result); } } // 2 / (2 * x) // 2 / (x * 2) else if (div.Right is Mul && div.Left is Number) { var bracketMul = div.Right as Mul; var firstNumber = div.Left as Number; if (bracketMul.Left is Number) { var secondNumber = bracketMul.Left as Number; var result = new Div(new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()), bracketMul.Right); return _Simplify(result); } if (bracketMul.Right is Number) { var secondNumber = bracketMul.Right as Number; var result = new Div(new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()), bracketMul.Left); return _Simplify(result); } } // (2 / x) / 2 // (x / 2) / 2 else if (div.Left is Div && div.Right is Number) { var bracketDiv = div.Left as Div; var firstNumber = div.Right as Number; if (bracketDiv.Left is Number) { var secondNumber = bracketDiv.Left as Number; var result = new Div(new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()), bracketDiv.Right); return _Simplify(result); } if (bracketDiv.Right is Number) { var secondNumber = bracketDiv.Right as Number; var result = new Div(bracketDiv.Left, new Number((double)firstNumber.Calculate() * (double)secondNumber.Calculate())); return _Simplify(result); } } // 2 / (2 / x) // 2 / (x / 2) else if (div.Right is Div && div.Left is Number) { var bracketDiv = div.Right as Div; var firstNumber = div.Left as Number; if (bracketDiv.Left is Number) { var secondNumber = bracketDiv.Left as Number; var result = new Mul(new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()), bracketDiv.Right); return _Simplify(result); } if (bracketDiv.Right is Number) { var secondNumber = bracketDiv.Right as Number; var result = new Div(new Number((double)firstNumber.Calculate() * (double)secondNumber.Calculate()), bracketDiv.Left); return _Simplify(result); } } return div; }
public void CalculateTest() { IExpression exp = new Div(new Number(1), new Number(2)); Assert.AreEqual(1.0 / 2.0, exp.Calculate()); }