Пример #1
0
        public override Number Divide(Number n)
        {
            CheckDenominator(n);

            if (!(n is CNumber number))
            {
                return(this);
            }

            // a = real, b = imaginary, c = number.real, d = number.imaginary

            // b * d
            var reNum = new PNumber(imaginary.decimalNum * number.imaginary.decimalNum);
            // a * d
            var imNum = new PNumber(real.decimalNum * number.imaginary.decimalNum);
            // c^2 + d^2
            var denom = new PNumber((Math.Pow(number.real.decimalNum, 2)
                                     + Math.Pow(number.imaginary.decimalNum, 2)));

            // (a * c + b * d) / (c^2 + d^2)
            real.Multiply(number.real).Add(reNum).Divide(denom);
            // (b * c - a * d) / (c^2 + d^2)
            imaginary.Multiply(number.real).Subtract(imNum).Divide(denom);

            return(this);
        }
Пример #2
0
        public void ResetProcess(Mode mode)
        {
            currentMode = mode;
            switch (mode)
            {
            case Mode.PNumber:
                leftNumber  = new PNumber();
                rightNumber = new PNumber();
                break;

            case Mode.Fractional:
                leftNumber  = new FNumber();
                rightNumber = new FNumber();
                break;

            case Mode.Complex:
                leftNumber  = new CNumber();
                rightNumber = new CNumber();
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(mode), mode, null);
            }
            operation = Operation.None;
            function  = Function.None;
        }
Пример #3
0
        public override Number Inverse()
        {
            var res = new CNumber(1, 0).Divide(this);

            real      = (res as CNumber)?.real;
            imaginary = (res as CNumber)?.imaginary;
            return(this);
        }
Пример #4
0
 public FNumber(double n, double dn)
 {
     numerator   = new PNumber(n);
     denominator =
         Math.Abs(dn) >= D_EPS
             ? new PNumber(dn)
             : new PNumber(1);
     CheckDenominator(denominator);
 }
Пример #5
0
        public override Number Inverse()
        {
            CheckDenominator(numerator);

            var newNum = denominator.Copy();

            denominator = (PNumber)numerator.Copy();
            numerator   = (PNumber)newNum;
            return(this);
        }
Пример #6
0
        public override Number SetNumberFromString(string n, int additional = 0)
        {
            var num = n.Split('/');

            denominator = num.Length == 2
                ? new PNumber(num[1], 10)
                : new PNumber(1, 10);

            CheckDenominator(denominator);
            numerator = new PNumber(num[0], 10);
            return(this);
        }
Пример #7
0
        public override Number Multiply(Number n)
        {
            if (!(n is CNumber number))
            {
                return(this);
            }

            var re = new PNumber(imaginary.decimalNum * number.imaginary.decimalNum);
            var im = new PNumber(real.decimalNum * number.imaginary.decimalNum);

            real.Multiply(number.real).Subtract(re);
            imaginary.Multiply(number.real).Add(im);

            return(this);
        }
Пример #8
0
        public override Number SetNumberFromString(string n, int additional = 0)
        {
            var num = n.Split('i');

            if (num[0] != "")
            {
                switch (num[0][num[0].Length - 1])
                {
                case '-':
                    num[1] = "-" + num[1];
                    num[0] = num[0].Remove(num[0].Length - 1);
                    break;

                case '+':
                    num[0] = num[0].Remove(num[0].Length - 1);
                    break;
                }
                real = new PNumber(num[0] != "" ? num[0] : "0", 10);
            }
            else
            {
                real = new PNumber();
            }

            if (num.Length == 2)
            {
                if (num[1] != "")
                {
                    imaginary = num[1] == "-"
                        ? new PNumber(-1)
                        : new PNumber(num[1], 10);
                }
                else
                {
                    imaginary = new PNumber(1);
                }
            }
            else
            {
                imaginary = new PNumber();
            }

            return(this);
        }
Пример #9
0
        public override Number Multiply(Number n)
        {
            if (!(n is FNumber number))
            {
                return(this);
            }

            if (denominator.IsEqualTo(numerator))
            {
                denominator = new PNumber(1, 10);
                numerator   = new PNumber(1, 10);
            }

            numerator.Multiply(number.numerator);
            denominator.Multiply(number.denominator);
            Simplify();

            return(this);
        }
Пример #10
0
        public Number Simplify()
        {
            if (denominator.IsEqualTo(numerator))
            {
                denominator = new PNumber(1, 10);
                numerator   = new PNumber(1, 10);
            }

            var gcd = GCD(Math.Abs(numerator.decimalNum), Math.Abs(denominator.decimalNum));

            if (gcd < F_EPS || Math.Abs(gcd - 1.0d) < F_EPS)
            {
                return(this);
            }

            numerator.Multiply(new PNumber(Math.Round(1 / gcd, 5)));
            denominator.Multiply(new PNumber(Math.Round(1 / gcd, 5)));

            return(this);
        }
Пример #11
0
        public void Reset(Processor.Mode mode)
        {
            memoryState = State.Off;
            switch (mode)
            {
            case Processor.Mode.PNumber:
                number = new PNumber();
                break;

            case Processor.Mode.Fractional:
                number = new FNumber();
                break;

            case Processor.Mode.Complex:
                number = new CNumber();
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(mode), mode, null);
            }
        }
Пример #12
0
 public CNumber(Number re, Number im)
 {
     real      = re.Copy() as PNumber;
     imaginary = im.Copy() as PNumber;
 }
Пример #13
0
 public override Number Reset()
 {
     real      = new PNumber();
     imaginary = new PNumber(1, 10);
     return(this);
 }
Пример #14
0
 public bool IsEqualTo(PNumber n) => Math.Abs(decimalNum - n.decimalNum) <= D_EPS;
Пример #15
0
 public CNumber(double re, double im)
 {
     real      = new PNumber(re);
     imaginary = new PNumber(im);
 }
Пример #16
0
 public override Number Reset()
 {
     numerator   = new PNumber();
     denominator = new PNumber(1);
     return(this);
 }
Пример #17
0
 public FNumber(Number n, Number dn)
 {
     numerator   = n.Copy() as PNumber;
     denominator = dn.Copy() as PNumber;
     CheckDenominator(denominator);
 }