public static Fraction operator /(Fraction f1, Fraction f2) { if (f1.IsNaN || f2.IsNaN) return NaN; Fraction f = new Fraction( (f2.Numerator < 0 ? -1 : 1) * f1.Numerator * f2.Denominator, (f2.Numerator < 0 ? -1 : 1) * f1.Denominator * f2.Numerator); f.reduce(); return f; }
public static FractionExpression Constant(Fraction f) { var e = new FractionExpression(); e.constant = f; return e; }
public bool Equals(Fraction f) { if (IsNaN && f.IsNaN) return true; if (IsNaN || f.IsNaN) return false; if (Numerator == 0 && f.Numerator == 0) return true; this.reduce(); f.reduce(); return Numerator == f.Numerator && Denominator == f.Denominator; }
private void calculate(bool calAll) { _result = new List<Tuple<int[], OpFlag[], int[]>>(); Fraction[] tempResult = new Fraction[CalculateCount - 1]; List<int> effectlist = new List<int>(); foreach (var numbers in _permNumbers) { var arrayNumber = numbers.ToArray(); foreach (var ops in _ops) { var arrayOp = ops.ToArray(); foreach (var precendences in _precedenceOp) { for (int i = 0; i < tempResult.Length; ++i) { tempResult[i] = Fraction.NaN; } effectlist.Clear(); var f = Fraction.NaN; foreach (var p in precendences) { Fraction f1, f2; int left, right; if (p > 0) left = p - 1; else left = p; if (p + 1 < tempResult.Length) right = p + 1; else right = p; if (!tempResult[left].IsNaN) { f1 = tempResult[left]; effectlist.Add(left); } else f1 = _numbers[arrayNumber[p]]; if (!tempResult[right].IsNaN) { f2 = tempResult[right]; effectlist.Add(right); } else f2 = _numbers[arrayNumber[p + 1]]; f = tempResult[p] = _calculator[arrayOp[p]](f1, f2); if (f.IsNaN) break; foreach (var ei in effectlist) { tempResult[ei] = f; } } if (f.IsInteger && f == CalculateResult) { var equ = precendences.ToArray(); _result.Add(new Tuple<int[], OpFlag[], int[]>( arrayNumber, arrayOp, equ)); //if (!_result.Any(l => // l.Item1.SequenceEqual(arrayNumber) // && l.Item2.SequenceEqual(arrayOp) // && l.Item3.SequenceEqual(equ))) //{ // _result.Add(new Tuple<int[], OpFlag[], int[]>( // arrayNumber, // arrayOp, // equ)); //} if (!calAll) return; } } } } }