private static Fraction Multiply(Fraction left, Fraction right) { if (left.IsNaN() || right.IsNaN()) { return(NaN); } CrossReducePair(ref left, ref right); try { checked { var numerator = left.Numerator * right.Numerator; var denominator = left.Denominator * right.Denominator; return(new Fraction(numerator, denominator)); } } catch (Exception) { //throw new FractionException("Multiply error", ex); return(new Fraction(left.ToDouble() * right.ToDouble())); } }
private static Fraction Add(Fraction left, Fraction right) { if (left.IsNaN() || right.IsNaN()) { return(NaN); } var gcd = GCD(left.Denominator, right.Denominator); // nie może zwrócić mniej niż 1 var leftDenominator = left.Denominator / gcd; var rightDenominator = right.Denominator / gcd; try { checked { var numerator = left.Numerator * rightDenominator + right.Numerator * leftDenominator; var denominator = leftDenominator * rightDenominator * gcd; return(new Fraction(numerator, denominator)); } } catch (Exception) { //throw new FractionException("Error dodawania", ex); return(new Fraction(left.ToDouble() + right.ToDouble())); // przybliż ekstremalne przypadki } }
private static int IndeterminantCompare(Indeterminates leftType, Fraction right) { switch (leftType) { case Indeterminates.NaN: // NaN jest: if (right.IsNaN()) // równe NaN { return(0); } if (right.IsNegativeInfinity()) { return(1); // większe niż -niekończoność } return(-1); // mniejsze niż cokolwiek innego case Indeterminates.NegativeInfinity: // -nieskończoność jest: if (right.IsNegativeInfinity()) // równe -nieskończoność { return(0); } return(-1); // mniejsze niż cokolwiek innego case Indeterminates.PositiveInfinity: // nieskończoność jest: return(right.IsPositiveInfinity() ? 0 : 1); // równe nieskończoność lub większe niż cokolwiek innego default: // nie powinno być osiągalne return(0); } }
public PointFr(Fraction x, Fraction y) { if (x.IsNaN() || y.IsNaN() || x.IsInfinity() || y.IsInfinity()) { throw new ArgumentException("x i y nie może wynosić NaN lub Nieskończoność"); } _x = x; _y = y; }
public LineFr(Fraction slope, PointFr p) { if (slope.IsNaN()) { throw new ArgumentException("Slope (Nachylenie) nie może przyjmować wartości NaN"); } Slope = slope.IsInfinity() ? Fraction.PositiveInfinity : slope; Constant = CalculateConstant(p, slope); }
public LineFr(Fraction slope, Fraction constant) { if (slope.IsNaN() || constant.IsNaN()) { throw new ArgumentException("Slope (Nachylenie) i Constant (Stała) nie mogą przyjmować wartości NaN"); } Slope = slope; Constant = constant; }
private static Fraction Modulus(Fraction left, Fraction right) { if (left.IsNaN() || right.IsNaN()) { return(NaN); } try { checked { var quotient = (int)(left / right); var whole = new Fraction(quotient * right.Numerator, right.Denominator); return(left - whole); } } catch (Exception) { //throw new FractionException("Modulus error", ex); return(new Fraction(left.ToDouble() % right.ToDouble())); } }