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); }
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; }
public override Number Inverse() { var res = new CNumber(1, 0).Divide(this); real = (res as CNumber)?.real; imaginary = (res as CNumber)?.imaginary; return(this); }
public FNumber(double n, double dn) { numerator = new PNumber(n); denominator = Math.Abs(dn) >= D_EPS ? new PNumber(dn) : new PNumber(1); CheckDenominator(denominator); }
public override Number Inverse() { CheckDenominator(numerator); var newNum = denominator.Copy(); denominator = (PNumber)numerator.Copy(); numerator = (PNumber)newNum; return(this); }
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); }
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); }
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); }
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); }
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); }
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); } }
public CNumber(Number re, Number im) { real = re.Copy() as PNumber; imaginary = im.Copy() as PNumber; }
public override Number Reset() { real = new PNumber(); imaginary = new PNumber(1, 10); return(this); }
public bool IsEqualTo(PNumber n) => Math.Abs(decimalNum - n.decimalNum) <= D_EPS;
public CNumber(double re, double im) { real = new PNumber(re); imaginary = new PNumber(im); }
public override Number Reset() { numerator = new PNumber(); denominator = new PNumber(1); return(this); }
public FNumber(Number n, Number dn) { numerator = n.Copy() as PNumber; denominator = dn.Copy() as PNumber; CheckDenominator(denominator); }