コード例 #1
0
ファイル: Simplifier.cs プロジェクト: smwentum/xFunc
        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;
        }
コード例 #2
0
ファイル: DivisionTest.cs プロジェクト: ronnycsharp/xFunc
        public void CalculateTest()
        {
            IExpression exp = new Div(new Number(1), new Number(2));

            Assert.AreEqual(1.0 / 2.0, exp.Calculate());
        }