예제 #1
0
        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()));
            }
        }
예제 #2
0
        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
            }
        }
예제 #3
0
        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);
            }
        }
예제 #4
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;
 }
예제 #5
0
        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);
        }
예제 #6
0
        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;
        }
예제 #7
0
        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()));
            }
        }