예제 #1
0
        public void DivideTest()
        {
            for (var i = -70; i < 70; i += 3)
            {
                for (var j = -70; j < 70; j += 3)
                {
                    if (j == 0)
                    {
                        continue;
                    }

                    const string op     = "/";
                    var          target = i / j;

                    var s = string.Format("{1}{0}{2}", op, i, j);
                    Assert.AreEqual(target, (int)MathString.Parse(s, null), s);
                    s = string.Format("{1} {0}{2}", op, i, j);
                    Assert.AreEqual(target, (int)MathString.Parse(s, null), s);
                    s = string.Format("{1}{0} {2}", op, i, j);
                    Assert.AreEqual(target, (int)MathString.Parse(s, null), s);
                    s = string.Format("{1}   {0}    {2}", op, i, j);
                    Assert.AreEqual(target, (int)MathString.Parse(s, null), s);
                }
            }
        }
예제 #2
0
        static void Main(string[] args)
        {
            MethodPointer methodPointer = AddInt;

            Console.WriteLine(methodPointer(2, 3));
            Console.WriteLine(CompareValue(2, 3, CompareAsc));
            //Anonymous Method
            MethodPointer Point = delegate(int a, int b)
            {
                return(a + b);
            };

            Console.WriteLine(CompareValue(2, 3, delegate(int a, int b) { return(a > b); }));

            //Lambda Expression
            MathZarb2 zarb2   = (a) => { return(a * 2); };
            MathZarb2 zarb2_2 = a => a * 2;

            Console.WriteLine("Lambda Expression: " + zarb2_2(2));
            //Generic
            MathString <string, int, int> mathString = (p1, p2) =>
            {
                return((p1 * p2).ToString());
            };
            MathString <string, int, int> mathString_2 = delegate(int p1, int p2)
            {
                return((p1 * p2).ToString());
            };

            Console.WriteLine("Generic: " + mathString_2(2, 3));
        }
예제 #3
0
        public void Exp3Test()
        {
            for (var i = -5; i < 5; i++)
            {
                for (var j = 0; j < 5; j++)
                {
                    for (var k = 0; k < 5; k++)
                    {
                        if (j == 0 || k == 0)
                        {
                            continue;
                        }

                        const string op     = "^";
                        var          target = Math.Pow(Math.Pow(i, j), k);

                        var s = string.Format("{1}{0}{2}{0}{3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                        s = string.Format("{1} {0}{2}{0}   {3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                        s = string.Format("{1}{0} {2}  {0}  {3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                        s = string.Format("{1}   {0}    {2}   {0}     {3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                    }
                }
            }
        }
예제 #4
0
        public void Divide3Test()
        {
            for (var i = -7; i < 7; i++)
            {
                for (var j = -7; j < 7; j++)
                {
                    for (var k = -7; k < 7; k++)
                    {
                        if (j == 0 || k == 0)
                        {
                            continue;
                        }

                        const string op     = "/";
                        var          target = i / j / k;

                        var s = string.Format("{1}{0}{2}{0}{3}", op, i, j, k);
                        Assert.AreEqual(target, (int)MathString.Parse(s, null), s);
                        s = string.Format("{1} {0}{2}{0}   {3}", op, i, j, k);
                        Assert.AreEqual(target, (int)MathString.Parse(s, null), s);
                        s = string.Format("{1}{0} {2}  {0}  {3}", op, i, j, k);
                        Assert.AreEqual(target, (int)MathString.Parse(s, null), s);
                        s = string.Format("{1}   {0}    {2}   {0}     {3}", op, i, j, k);
                        Assert.AreEqual(target, (int)MathString.Parse(s, null), s);
                    }
                }
            }
        }
예제 #5
0
        public void MathString_type_is_formatted()
        {
            var latex = new MathString(@"F(k) = \int_{-\infty}^{\infty} f(x) e^{2\pi i k} dx");

            var mimeType = Formatter.PreferredMimeTypeFor(latex.GetType());

            var formattedValue = new FormattedValue(
                mimeType,
                latex.ToDisplayString(mimeType));

            formattedValue.MimeType.Should().Be("text/latex");
            formattedValue.Value.Should().Be(@"$$F(k) = \int_{-\infty}^{\infty} f(x) e^{2\pi i k} dx$$");
        }
예제 #6
0
        public void Can_generate_LaTeX_string_from_LaTeX_object()
        {
            Formatter <MathString> .Register((math, writer) =>
            {
                writer.Write(math.ToString());
            },
                                             "text/latex");

            var mathSource = @"F(k) = \int_{-\infty}^{\infty} f(x) e^{2\pi i k} dx";
            var math       = new MathString(mathSource);
            var writer     = new StringWriter();

            math.FormatTo(writer, "text/latex");
            var s = writer.ToString();

            s.Should().Be($"$${mathSource}$$");
        }
예제 #7
0
        static void DelegatesMath()
        {
            OverMath math    = new OverMath();
            MathInt  mathInt = math.Plus;

            Console.WriteLine(n1 + " + " + n2 + " = " + mathInt(n1, n2));
            mathInt = math.Minus;
            Console.WriteLine(n1 + " - " + n2 + " = " + mathInt(n1, n2));
            mathInt = math.Gange;
            Console.WriteLine(n1 + " * " + n2 + " = " + mathInt(n1, n2));
            mathInt = math.Dividere;
            Console.WriteLine(n1 + " / " + n2 + " = " + mathInt(n1, n2));
            mathInt = math.Potens;
            Console.WriteLine(n1 + "^" + n2 + " = " + mathInt(n1, n2));
            MathFloat mathFloat = math.Plus;

            Console.WriteLine(n3 + " + " + n4 + " = " + mathFloat(n3, n4));
            mathFloat = math.Minus;
            Console.WriteLine(n3 + " - " + n4 + " = " + mathFloat(n3, n4));
            mathFloat = math.Gange;
            Console.WriteLine(n3 + " * " + n4 + " = " + mathFloat(n3, n4));
            mathFloat = math.Dividere;
            Console.WriteLine(n3 + " / " + n4 + " = " + mathFloat(n3, n4));
            mathFloat = math.Potens;
            Console.WriteLine(n3 + "^" + n4 + " = " + mathFloat(n3, n4));
            MathString mathString = math.Plus;

            Console.WriteLine(n5 + " + " + n6 + " = " + mathString(n5, n6));
            mathString = math.Minus;
            Console.WriteLine(n5 + " - " + n6 + " = " + mathString(n5, n6));
            mathString = math.Gange;
            Console.WriteLine(n5 + " * " + n6 + " = " + mathString(n5, n6));
            mathString = math.Dividere;
            Console.WriteLine(n5 + " / " + n6 + " = " + mathString(n5, n6));
            mathString = math.Potens;
            Console.WriteLine(n5 + "^" + n6 + " = " + mathString(n5, n6));
            Math1Int    math1Int    = math.Kvadratrod;
            Math1Float  math1Float  = math.Kvadratrod;
            Math1String math1String = math.Kvadratrod;

            Console.WriteLine("Kvadratroden af 64 = " + math1Int((int)64));
            Console.WriteLine("Kvadratroden af 9 = " + math1Float((float)9));
            Console.WriteLine("Kvadratroden af 625 = " + math1String("625"));
        }
예제 #8
0
        public void AddTest()
        {
            for (var i = -100; i < 100; i += 9)
            {
                for (var j = -100; j < 100; j += 9)
                {
                    const string op     = "+";
                    var          target = i + j;

                    var s = string.Format("{1}{0}{2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                    s = string.Format("{1} {0}{2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                    s = string.Format("{1}{0} {2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                    s = string.Format("{1}   {0}    {2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                }
            }
        }
예제 #9
0
        public void SubtractTest()
        {
            for (var i = -70; i < 70; i += 3)
            {
                for (var j = -70; j < 70; j += 3)
                {
                    const string op     = "-";
                    var          target = i - j;

                    var s = string.Format("{1}{0}{2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                    s = string.Format("{1} {0}{2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                    s = string.Format("{1}{0} {2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                    s = string.Format("{1}   {0}    {2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                }
            }
        }
예제 #10
0
        public void ExpTest()
        {
            for (var i = -20; i < 20; i++)
            {
                for (var j = 0; j < 10; j++)
                {
                    const string op     = "^";
                    var          target = Math.Pow(i, j);

                    var s = string.Format("{1}{0}{2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                    s = string.Format("{1} {0}{2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                    s = string.Format("{1}{0} {2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                    s = string.Format("{1}   {0}    {2}", op, i, j);
                    Assert.AreEqual(target, MathString.Parse(s, null), s);
                }
            }
        }
예제 #11
0
        public void Subtract3Test()
        {
            for (var i = -7; i < 7; i++)
            {
                for (var j = -7; j < 7; j++)
                {
                    for (var k = -7; k < 7; k++)
                    {
                        const string op     = "-";
                        var          target = i - j - k;

                        var s = string.Format("{1}{0}{2}{0}{3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                        s = string.Format("{1} {0}{2}{0}   {3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                        s = string.Format("{1}{0} {2}  {0}  {3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                        s = string.Format("{1}   {0}    {2}   {0}     {3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                    }
                }
            }
        }
예제 #12
0
        public void Multiply3Test()
        {
            for (var i = -10; i < 10; i++)
            {
                for (var j = -10; j < 10; j++)
                {
                    for (var k = -10; k < 10; k++)
                    {
                        const string op     = "*";
                        var          target = i * j * k;

                        var s = string.Format("{1}{0}{2}{0}{3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                        s = string.Format("{1} {0}{2}{0}   {3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                        s = string.Format("{1}{0} {2}  {0}  {3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                        s = string.Format("{1}   {0}    {2}   {0}     {3}", op, i, j, k);
                        Assert.AreEqual(target, MathString.Parse(s, null), s);
                    }
                }
            }
        }
예제 #13
0
 public void testClean()
 {
     mathStringClass = null;
 }
예제 #14
0
 public void testInit()
 {
     mathStringClass = new MathString();
 }
예제 #15
0
        public static IType Operate(this Operator op, IType left, IType right)
        {
            if (left is IPopup)
            {
                if (!(left is Types.Void && (op == Operator.EQUALS || op == Operator.NOT_EQUALS)))
                {
                    return(left);
                }
            }
            if (right is IPopup)
            {
                if (!(right is Types.Void && (op == Operator.EQUALS || op == Operator.NOT_EQUALS)))
                {
                    return(right);
                }
            }

            Number n1 = left as Number;
            Number n2 = right as Number;

            Types.Vector v1 = left as Types.Vector;
            Types.Vector v2 = right as Types.Vector;

            MathString s1 = left as MathString;
            MathString s2 = right as MathString;

            MathBool b1 = left as MathBool;
            MathBool b2 = right as MathBool;

            switch (op)
            {
            case Operator.ADD:
                if (n1 != null && n2 != null)
                {
                    return(new Number(n1.value + n2.value));
                }
                if (v1 != null && v2 != null)
                {
                    return(new Types.Vector(v1.items.Combine(v2.items, (x, y) => Operator.ADD.Operate(x, y))));
                }
                else if (s1 != null && s2 != null)
                {
                    return(new MathString(s1.value + s2.value));
                }
                else if (b1 != null && b2 != null)
                {
                    return(b1.value || b2.value ? MathBool.TRUE : MathBool.FALSE);
                }
                return(new Error("WrongType", $"The + operator cannot be applied to types {left.TypeName} and {right.TypeName}"));

            case Operator.SUBTRACT:
                if (n1 != null && n2 != null)
                {
                    return(new Number(n1.value - n2.value));
                }
                return(new Error("WrongType", $"The - operator cannot be applied to types {left.TypeName} and {right.TypeName}"));

            case Operator.MULTIPLY:
                if (n1 != null && n2 != null)
                {
                    return(new Number(n1.value * n2.value));
                }
                else if (v1 != null && v2 != null)
                {
                    return(v1.items.Combine(v2.items, (x, y) => Operator.MULTIPLY.Operate(x, y)).Aggregate((x, y) => Operator.ADD.Operate(x, y)));
                }
                else if ((v1 ?? v2) != null && (n1 ?? n2) != null)
                {
                    return(new Types.Vector((v1 ?? v2).items.Select((x, y) => Operator.MULTIPLY.Operate(x, n1 ?? n2)).ToArray()));
                }
                else if (b1 != null && b2 != null)
                {
                    return(b1.value && b2.value ? MathBool.TRUE : MathBool.FALSE);
                }
                return(new Error("WrongType", $"The * operator cannot be applied to types {left.TypeName} and {right.TypeName}"));

            case Operator.DIVIDE:
                if (n1 != null && n2 != null)
                {
                    return(new Number(n1.value / n2.value));
                }
                else if ((v1 ?? v2) != null && (n1 ?? n2) != null)
                {
                    return(new Types.Vector((v1 ?? v2).items.Select((x, y) => Operator.DIVIDE.Operate(x, n1 ?? n2)).ToArray()));
                }
                return(new Error("WrongType", $"The / operator cannot be applied to types {left.TypeName} and {right.TypeName}"));

            case Operator.MODULO:
                if (n1 != null && n2 != null)
                {
                    double mod(double a, double n) => n == 0 ? 0 : ((a % n) + n) % n;

                    return(new Number(new Complex(mod(n1.value.Real, n2.value.Real),
                                                  mod(n1.value.Imaginary, n2.value.Imaginary))));
                }
                return(new Error("WrongType", $"The / operator cannot be applied to types {left.TypeName} and {right.TypeName}"));

            case Operator.EXPONENT:
                if (n1 != null && n2 != null)
                {
                    if (n1.IsReal && n2.IsReal)
                    {
                        return(new Number(Math.Pow(n1.value.Real, n2.value.Real)));
                    }
                    else if (n1.value.Real == 0 && !n1.IsReal && n2.IsReal && n2.value.Real % 1 == 0)
                    {
                        Complex c;
                        switch (((n2.value.Real % 4) + 4) % 4)
                        {
                        case 1:
                            c = new Complex(0, 1);
                            break;

                        case 2:
                            c = new Complex(-1, 0);
                            break;

                        case 3:
                            c = new Complex(0, -1);
                            break;

                        case 0:
                            c = new Complex(1, 0);
                            break;
                        }
                        return(new Number(c * Math.Pow(n1.value.Imaginary, n2.value.Real)));
                    }
                    return(new Number(Complex.Pow(n1.value, n2.value)));
                }
                return(new Error("WrongType", $"The / operator cannot be applied to types {left.TypeName} and {right.TypeName}"));

            case Operator.EQUALS:
                return(left.Equals(right) ? MathBool.TRUE : MathBool.FALSE);

            case Operator.NOT_EQUALS:
                return(left.Equals(right) ? MathBool.FALSE : MathBool.TRUE);

            case Operator.GREATER:
                if (n1 != null && n2 != null)
                {
                    if (n1.value.Real != n2.value.Real)
                    {
                        return((n1.value.Real > n2.value.Real) ? MathBool.TRUE : MathBool.FALSE);
                    }
                    else
                    {
                        return((n1.value.Imaginary > n2.value.Imaginary) ? MathBool.TRUE : MathBool.FALSE);
                    }
                }
                return(new Error("WrongType", $"The > comparison operator cannot be applied to types {left.TypeName} and {right.TypeName}"));

            case Operator.LESS:
                if (n1 != null && n2 != null)
                {
                    if (n1.value.Real != n2.value.Real)
                    {
                        return((n1.value.Real < n2.value.Real) ? MathBool.TRUE : MathBool.FALSE);
                    }
                    else
                    {
                        return((n1.value.Imaginary < n2.value.Imaginary) ? MathBool.TRUE : MathBool.FALSE);
                    }
                }
                return(new Error("WrongType", $"The < comparison operator cannot be applied to types {left.TypeName} and {right.TypeName}"));

            case Operator.GR_EQUAL:
                if (n1 != null && n2 != null)
                {
                    if (n1.value.Real != n2.value.Real)
                    {
                        return((n1.value.Real >= n2.value.Real) ? MathBool.TRUE : MathBool.FALSE);
                    }
                    else
                    {
                        return((n1.value.Imaginary >= n2.value.Imaginary) ? MathBool.TRUE : MathBool.FALSE);
                    }
                }
                return(new Error("WrongType", $"The >= comparison operator cannot be applied to types {left.TypeName} and {right.TypeName}"));

            case Operator.LE_EQUAL:
                if (n1 != null && n2 != null)
                {
                    if (n1.value.Real != n2.value.Real)
                    {
                        return((n1.value.Real <= n2.value.Real) ? MathBool.TRUE : MathBool.FALSE);
                    }
                    else
                    {
                        return((n1.value.Imaginary <= n2.value.Imaginary) ? MathBool.TRUE : MathBool.FALSE);
                    }
                }
                return(new Error("WrongType", $"The <= comparison operator cannot be applied to types {left.TypeName} and {right.TypeName}"));
            }
            return(new Error("UnexpectedError", "An unexpected error occured with an operator."));
        }