Exemplo n.º 1
0
 public void TestAbs()
 {
     TestCommon.CompareTestEqual(
         ToCN(2),
         ToCN(-2).Abs());
     TestCommon.CompareTestEqual(
         ToCN(2),
         ToCN(2).Abs());
     TestCommon.CompareTestEqual(
         ToCN(2.5),
         ToCN(-2.5).Abs());
     {
         CBORNumber objectTemp  = ToCN(EDecimal.FromString("6.63"));
         CBORNumber objectTemp2 = ToCN(EDecimal.FromString(
                                           "-6.63")).Abs();
         TestCommon.CompareTestEqual(objectTemp, objectTemp2);
     }
     {
         CBORNumber objectTemp  = ToCN(EFloat.FromString("2.75"));
         CBORNumber objectTemp2 = ToCN(EFloat.FromString("-2.75")).Abs();
         TestCommon.CompareTestEqual(objectTemp, objectTemp2);
     }
     {
         CBORNumber objectTemp  = ToCN(ERational.FromDouble(2.5));
         CBORNumber objectTemp2 = ToCN(ERational.FromDouble(-2.5)).Abs();
         TestCommon.CompareTestEqual(objectTemp, objectTemp2);
     }
 }
Exemplo n.º 2
0
        public CBORObject ValidateObject(CBORObject obj)
        {
            if (obj.Type != CBORType.Array)
            {
                throw new CBORException("Rational number must be an array");
            }
            if (obj.Count != 2)
            {
                throw new CBORException("Rational number requires exactly 2 items");
            }
            CBORObject first  = obj[0];
            CBORObject second = obj[1];

            if (!first.IsIntegral)
            {
                throw new CBORException("Rational number requires integer numerator");
            }
            if (!second.IsIntegral)
            {
                throw new CBORException("Rational number requires integer denominator");
            }
            if (second.Sign <= 0)
            {
                throw new CBORException("Rational number requires denominator greater than 0");
            }
            EInteger denom = second.AsEInteger();

            // NOTE: Discards tags. See comment in CBORTag2.
            return(denom.Equals(EInteger.One) ?
                   CBORObject.FromObject(first.AsEInteger()) :
                   CBORObject.FromObject(
                       ERational.Create(
                           first.AsEInteger(),
                           denom)));
        }
Exemplo n.º 3
0
        public void TestCreateNaN()
        {
            try {
                ERational.CreateNaN(null);
                Assert.Fail("Should have failed");
            } catch (ArgumentNullException) {
                new Object();
            } catch (Exception ex) {
                Assert.Fail(ex.ToString());
                throw new InvalidOperationException(String.Empty, ex);
            }
            try {
                ERational.CreateNaN(EInteger.FromString("-1"));
                Assert.Fail("Should have failed");
            } catch (ArgumentException) {
                new Object();
            } catch (Exception ex) {
                Assert.Fail(ex.ToString());
                throw new InvalidOperationException(String.Empty, ex);
            }
            try {
                ERational.CreateNaN(null, false, false);
                Assert.Fail("Should have failed");
            } catch (ArgumentNullException) {
                new Object();
            } catch (Exception ex) {
                Assert.Fail(ex.ToString());
                throw new InvalidOperationException(String.Empty, ex);
            }
            ERational ef = ERational.CreateNaN(EInteger.Zero, false, true);

            Assert.IsTrue(ef.IsNegative);
            ef = ERational.CreateNaN(EInteger.Zero, false, false);
            Assert.IsTrue(!ef.IsNegative);
        }
Exemplo n.º 4
0
        public bool CanFitInDouble(object obj)
        {
            var ef = (ERational)obj;

            return((!ef.IsFinite) || (ef.CompareTo(ERational.FromDouble(
                                                       ef.ToDouble())) == 0));
        }
Exemplo n.º 5
0
 internal ExtendedRational(ERational er)
 {
     if (er == null)
     {
         throw new ArgumentNullException(nameof(er));
     }
     this.er = er;
 }
Exemplo n.º 6
0
        public void MathComparisonTest()
        {
            var r = new ERational(142342, 432);
            var f = EFloat.FromString("1.5", null);

            Console.WriteLine("{0}, {1}", r, f);
            Assert.IsTrue(r.CompareToBinary(f) > 0);
        }
Exemplo n.º 7
0
 /// <include file='../docs.xml'
 /// path='docs/doc[@name="M:PeterO.ExtendedRational.Create(System.Int32,System.Int32)"]/*'/>
 public static ExtendedRational Create(
     int numeratorSmall,
     int denominatorSmall)
 {
     return(new ExtendedRational(
                ERational.Create(
                    numeratorSmall,
                    denominatorSmall)));
 }
Exemplo n.º 8
0
        public static void TestStringEqualRoundTrip(ERational obj)
        {
            string    str    = obj.ToString();
            ERational newobj = ERational.FromString(str);
            string    str2   = newobj.ToString();

            TestCommon.AssertEqualsHashCode(obj, newobj);
            TestCommon.AssertEqualsHashCode(str, str2);
        }
Exemplo n.º 9
0
        public void TestEquals()
        {
            ERational era = ERational.FromString("0/3920");
            ERational erb = ERational.FromString("0/3920");

            TestCommon.CompareTestEqualAndConsistent(
                era,
                erb);
        }
Exemplo n.º 10
0
        public void TestCompareTo()
        {
            var r = new RandomGenerator();

            for (var i = 0; i < 500; ++i)
            {
                ERational bigintA = RandomObjects.RandomERational(r);
                ERational bigintB = RandomObjects.RandomERational(r);
                ERational bigintC = RandomObjects.RandomERational(r);
                TestCommon.CompareTestRelations(bigintA, bigintB, bigintC);
            }
            TestCommon.CompareTestLess(ERational.Zero, ERational.NaN);
            ERational rat, rat2;

            for (var i = 0; i < 100; ++i)
            {
                EInteger num = RandomObjects.RandomEInteger(r);
                if (num.IsZero)
                {
                    // Skip if number is 0; 0/1 and 0/2 are
                    // equal in that case
                    continue;
                }
                num  = num.Abs();
                rat  = ERational.Create(num, EInteger.One);
                rat2 = ERational.Create(num, (EInteger)2);
                TestCommon.CompareTestLess(rat2, rat);
                TestCommon.CompareTestGreater(rat, rat2);
            }
            TestCommon.CompareTestLess(
                ERational.Create(EInteger.One, (EInteger)2),
                ERational.Create((EInteger)4, EInteger.One));
            for (var i = 0; i < 100; ++i)
            {
                EInteger num = RandomObjects.RandomEInteger(r);
                EInteger den = RandomObjects.RandomEInteger(r);
                if (den.IsZero)
                {
                    den = EInteger.One;
                }
                rat = ERational.Create(num, den);
                for (int j = 0; j < 10; ++j)
                {
                    EInteger num2 = num;
                    EInteger den2 = den;
                    EInteger mult = RandomObjects.RandomEInteger(r);
                    if (mult.IsZero || mult.Equals(EInteger.One))
                    {
                        mult = (EInteger)2;
                    }
                    num2 *= (EInteger)mult;
                    den2 *= (EInteger)mult;
                    rat2  = ERational.Create(num2, den2);
                    TestCommon.CompareTestEqual(rat, rat2);
                }
            }
        }
Exemplo n.º 11
0
        public static void TestStringEqualRoundTrip(EFloat obj)
        {
            Assert.AreEqual(
                EDecimal.PositiveInfinity,
                EDecimal.FromSingle(Single.PositiveInfinity));
            Assert.AreEqual(
                EDecimal.NegativeInfinity,
                EDecimal.FromSingle(Single.NegativeInfinity));

            Assert.AreEqual(
                EFloat.PositiveInfinity,
                EFloat.FromDouble(Double.PositiveInfinity));
            Assert.AreEqual(
                EFloat.NegativeInfinity,
                EFloat.FromDouble(Double.NegativeInfinity));
            Assert.AreEqual(
                EFloat.PositiveInfinity,
                EFloat.FromSingle(Single.PositiveInfinity));
            Assert.AreEqual(
                EFloat.NegativeInfinity,
                EFloat.FromSingle(Single.NegativeInfinity));

            Assert.AreEqual(
                ERational.PositiveInfinity,
                ERational.FromDouble(Double.PositiveInfinity));
            Assert.AreEqual(
                ERational.NegativeInfinity,
                ERational.FromDouble(Double.NegativeInfinity));
            Assert.AreEqual(
                ERational.PositiveInfinity,
                ERational.FromSingle(Single.PositiveInfinity));
            Assert.AreEqual(
                ERational.NegativeInfinity,
                ERational.FromSingle(Single.NegativeInfinity));

            Assert.AreEqual(
                ERational.PositiveInfinity,
                ERational.FromEDecimal(EDecimal.PositiveInfinity));
            Assert.AreEqual(
                ERational.NegativeInfinity,
                ERational.FromEDecimal(EDecimal.NegativeInfinity));
            Assert.AreEqual(
                ERational.PositiveInfinity,
                ERational.FromEFloat(EFloat.PositiveInfinity));
            Assert.AreEqual(
                ERational.NegativeInfinity,
                ERational.FromEFloat(EFloat.NegativeInfinity));

            Assert.IsTrue(Double.IsPositiveInfinity(ERational.PositiveInfinity.ToDouble()));

            Assert.IsTrue(Double.IsNegativeInfinity(ERational.NegativeInfinity.ToDouble()));

            Assert.IsTrue(Single.IsPositiveInfinity(ERational.PositiveInfinity.ToSingle()));

            Assert.IsTrue(Single.IsNegativeInfinity(ERational.NegativeInfinity.ToSingle()));
        }
Exemplo n.º 12
0
        /// <summary>Returns the sum of this number and another
        /// number.</summary>
        /// <param name='b'>The number to add with this one.</param>
        /// <returns>The sum of this number and another number.</returns>
        /// <exception cref='ArgumentNullException'>The parameter <paramref
        /// name='b'/> is null.</exception>
        public CBORNumber Add(CBORNumber b)
        {
            if (b == null)
            {
                throw new ArgumentNullException(nameof(b));
            }
            CBORNumber a     = this;
            object     objA  = a.value;
            object     objB  = b.value;
            Kind       typeA = a.kind;
            Kind       typeB = b.kind;

            if (typeA == Kind.Integer && typeB == Kind.Integer)
            {
                var valueA = (long)objA;
                var valueB = (long)objB;
                if ((valueA < 0 && valueB < Int64.MinValue - valueA) ||
                    (valueA > 0 && valueB > Int64.MaxValue - valueA))
                {
                    // would overflow, convert to EInteger
                    return(CBORNumber.FromObject(
                               EInteger.FromInt64(valueA).Add(EInteger.FromInt64(valueB))));
                }
                return(new CBORNumber(Kind.Integer, valueA + valueB));
            }
            if (typeA == Kind.ERational ||
                typeB == Kind.ERational)
            {
                ERational e1 =
                    GetNumberInterface(typeA).AsExtendedRational(objA);
                ERational e2 = GetNumberInterface(typeB).AsExtendedRational(objB);
                return(new CBORNumber(Kind.ERational, e1.Add(e2)));
            }
            if (typeA == Kind.EDecimal ||
                typeB == Kind.EDecimal)
            {
                EDecimal e1 =
                    GetNumberInterface(typeA).AsExtendedDecimal(objA);
                EDecimal e2 = GetNumberInterface(typeB).AsExtendedDecimal(objB);
                return(new CBORNumber(Kind.EDecimal, e1.Add(e2)));
            }
            if (typeA == Kind.EFloat || typeB == Kind.EFloat ||
                typeA == Kind.Double || typeB == Kind.Double)
            {
                EFloat e1 = GetNumberInterface(typeA).AsExtendedFloat(objA);
                EFloat e2 = GetNumberInterface(typeB).AsExtendedFloat(objB);
                return(new CBORNumber(Kind.EFloat, e1.Add(e2)));
            }
            else
            {
                EInteger b1 = GetNumberInterface(typeA).AsEInteger(objA);
                EInteger b2 = GetNumberInterface(typeB).AsEInteger(objB);
                return(new CBORNumber(Kind.EInteger, b1 + (EInteger)b2));
            }
        }
Exemplo n.º 13
0
        public static ERational RandomERational(IRandomGenExtended rand)
        {
            EInteger bigintA = RandomEInteger(rand);
            EInteger bigintB = RandomEInteger(rand);

            if (bigintB.IsZero)
            {
                bigintB = EInteger.One;
            }
            return(ERational.Create(bigintA, bigintB));
        }
Exemplo n.º 14
0
        public void TestToString()
        {
            var       fr = new RandomGenerator();
            ERational dec;

            for (var i = 0; i < 1000; ++i)
            {
                dec = RandomObjects.RandomERational(fr);
                ExtraTest.TestStringEqualRoundTrip(dec);
            }
            dec = ERational.FromString("-0/500");
            ExtraTest.TestStringEqualRoundTrip(dec);
        }
Exemplo n.º 15
0
        /// <summary>Returns the remainder when this number is divided by
        /// another number.</summary>
        /// <param name='b'>The right-hand side (dividend) of the remainder
        /// operation.</param>
        /// <returns>The remainder when this number is divided by the other
        /// number.</returns>
        /// <exception cref='ArgumentNullException'>The parameter <paramref
        /// name='b'/> is null.</exception>
        public CBORNumber Remainder(CBORNumber b)
        {
            if (b == null)
            {
                throw new ArgumentNullException(nameof(b));
            }
            object objA  = this.value;
            object objB  = b.value;
            Kind   typeA = this.kind;
            Kind   typeB = b.kind;

            if (typeA == Kind.Integer && typeB == Kind.Integer)
            {
                var valueA = (long)objA;
                var valueB = (long)objB;
                return((valueA == Int64.MinValue && valueB == -1) ?
                       CBORNumber.FromObject(0) : CBORNumber.FromObject(valueA % valueB));
            }
            if (typeA == Kind.ERational ||
                typeB == Kind.ERational)
            {
                ERational e1 =
                    GetNumberInterface(typeA).AsExtendedRational(objA);
                ERational e2 = GetNumberInterface(typeB).AsExtendedRational(objB);
                return(CBORNumber.FromObject(e1.Remainder(e2)));
            }
            if (typeA == Kind.EDecimal ||
                typeB == Kind.EDecimal)
            {
                EDecimal e1 =
                    GetNumberInterface(typeA).AsExtendedDecimal(objA);
                EDecimal e2 = GetNumberInterface(typeB).AsExtendedDecimal(objB);
                return(CBORNumber.FromObject(e1.Remainder(e2, null)));
            }
            if (typeA == Kind.EFloat ||
                typeB == Kind.EFloat || typeA == Kind.Double || typeB ==
                Kind.Double)
            {
                EFloat e1 =
                    GetNumberInterface(typeA).AsExtendedFloat(objA);
                EFloat e2 = GetNumberInterface(typeB).AsExtendedFloat(objB);
                return(CBORNumber.FromObject(e1.Remainder(e2, null)));
            }
            else
            {
                EInteger b1 = GetNumberInterface(typeA).AsEInteger(objA);
                EInteger b2 = GetNumberInterface(typeB).AsEInteger(objB);
                return(CBORNumber.FromObject(b1 % (EInteger)b2));
            }
        }
Exemplo n.º 16
0
        public void TestToDouble()
        {
            // test for correct rounding
            double dbl;

            dbl = ERational.FromEDecimal(
                EDecimal.FromString(
                    "1.972579273363468721491642554610734805464744567871093749999999999999"))
                  .ToDouble();
            {
                string stringTemp = EFloat.FromDouble(dbl).ToPlainString();
                Assert.AreEqual(
                    "1.9725792733634686104693400920950807631015777587890625",
                    stringTemp);
            }
        }
Exemplo n.º 17
0
        public static void TestStringEqualRoundTrip(ERational obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException(nameof(obj));
            }
            string    str    = obj.ToString();
            ERational newobj = ERational.FromString(str);

            if (str.Length < 100 || !obj.Equals(newobj))
            {
                TestCommon.AssertEqualsHashCode(obj, newobj);
                string str2 = newobj.ToString();
                TestCommon.AssertEqualsHashCode(str, str2);
            }
        }
Exemplo n.º 18
0
        public void TestCompareToDecimal()
        {
            var fr = new RandomGenerator();

            for (var i = 0; i < 100; ++i)
            {
                ERational er  = RandomObjects.RandomERational(fr);
                int       exp = -100000 + fr.UniformInt(200000);
                EDecimal  ed  = EDecimal.Create(
                    RandomObjects.RandomEInteger(fr),
                    (EInteger)exp);
                ERational er2 = ERational.FromEDecimal(ed);
                int       c2r = er.CompareTo(er2);
                int       c2d = er.CompareToDecimal(ed);
                Assert.AreEqual(c2r, c2d);
            }
        }
Exemplo n.º 19
0
 /// <include file='../docs.xml'
 /// path='docs/doc[@name="M:PeterO.ExtendedRational.Create(PeterO.BigInteger,PeterO.BigInteger)"]/*'/>
 public static ExtendedRational Create(
     BigInteger numerator,
     BigInteger denominator)
 {
     if (numerator == null)
     {
         throw new ArgumentNullException(nameof(numerator));
     }
     if (denominator == null)
     {
         throw new ArgumentNullException(nameof(denominator));
     }
     return(new ExtendedRational(
                ERational.Create(
                    numerator.Ei,
                    denominator.Ei)));
 }
Exemplo n.º 20
0
        public void TestRemainder()
        {
            var fr = new RandomGenerator();

            for (var i = 0; i < 100; ++i)
            {
                ERational er;
                ERational er2;
                er = ERational.Create(
                    RandomObjects.RandomEInteger(fr),
                    EInteger.One);
                er2 = ERational.Create(
                    RandomObjects.RandomEInteger(fr),
                    EInteger.One);
                if (er2.IsZero || !er2.IsFinite)
                {
                    continue;
                }
                if (er.IsZero || !er.IsFinite)
                {
                    // Code below will divide by "er",
                    // so skip if "er" is zero
                    continue;
                }
                ERational ermult = er.Multiply(er2);
                ERational erdiv  = ermult.Divide(er);
                erdiv = ermult.Remainder(er);
                if (!erdiv.IsZero)
                {
                    Assert.Fail(ermult + "; " + er);
                }
                erdiv = ermult.Remainder(er2);
                if (!erdiv.IsZero)
                {
                    Assert.Fail(er + "; " + er2);
                }
            }
        }
Exemplo n.º 21
0
        public void TestDivide()
        {
            var fr = new RandomGenerator();

            for (var i = 0; i < 500; ++i)
            {
                ERational er  = RandomObjects.RandomERational(fr);
                ERational er2 = RandomObjects.RandomERational(fr);
                if (er2.IsZero || !er2.IsFinite)
                {
                    continue;
                }
                if (er.IsZero || !er.IsFinite)
                {
                    continue;
                }
                ERational ermult = er.Multiply(er2);
                ERational erdiv  = ermult.Divide(er);
                TestCommon.CompareTestEqual(erdiv, er2);
                erdiv = ermult.Divide(er2);
                TestCommon.CompareTestEqual(erdiv, er);
            }
        }
Exemplo n.º 22
0
 public ERational AsExtendedRational(object obj)
 {
     return(ERational.FromEFloat((EFloat)obj));
 }
Exemplo n.º 23
0
        public static CBORObject Subtract(CBORObject a, CBORObject b)
        {
            if (a == null)
            {
                throw new ArgumentNullException("a");
            }
            if (b == null)
            {
                throw new ArgumentNullException("b");
            }
            if (a.Type != CBORType.Number)
            {
                throw new ArgumentException("a.Type (" + a.Type +
                                            ") is not equal to " + CBORType.Number);
            }
            if (b.Type != CBORType.Number)
            {
                throw new ArgumentException("b.Type (" + b.Type +
                                            ") is not equal to " + CBORType.Number);
            }
            object objA  = a.ThisItem;
            object objB  = b.ThisItem;
            int    typeA = a.ItemType;
            int    typeB = b.ItemType;

            if (typeA == CBORObject.CBORObjectTypeInteger && typeB ==
                CBORObject.CBORObjectTypeInteger)
            {
                var valueA = (long)objA;
                var valueB = (long)objB;
                if ((valueB < 0 && Int64.MaxValue + valueB < valueA) ||
                    (valueB > 0 && Int64.MinValue + valueB > valueA))
                {
                    // would overflow, convert to EInteger
                    return(CBORObject.FromObject(((EInteger)valueA) -
                                                 (EInteger)valueB));
                }
                return(CBORObject.FromObject(valueA - valueB));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedRational ||
                typeB == CBORObject.CBORObjectTypeExtendedRational)
            {
                ERational e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedRational(objA);
                ERational e2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedRational(objB);
                return(CBORObject.FromObject(e1.Subtract(e2)));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedDecimal ||
                typeB == CBORObject.CBORObjectTypeExtendedDecimal)
            {
                EDecimal e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedDecimal(objA);
                EDecimal e2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedDecimal(objB);
                return(CBORObject.FromObject(e1.Subtract(e2)));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedFloat || typeB ==
                CBORObject.CBORObjectTypeExtendedFloat ||
                typeA == CBORObject.CBORObjectTypeDouble || typeB ==
                CBORObject.CBORObjectTypeDouble ||
                typeA == CBORObject.CBORObjectTypeSingle || typeB ==
                CBORObject.CBORObjectTypeSingle)
            {
                EFloat e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedFloat(objA);
                EFloat e2 = CBORObject.GetNumberInterface(typeB).AsExtendedFloat(objB);
                return(CBORObject.FromObject(e1.Subtract(e2)));
            }
            else
            {
                EInteger b1 = CBORObject.GetNumberInterface(typeA).AsEInteger(objA);
                EInteger b2 = CBORObject.GetNumberInterface(typeB).AsEInteger(objB);
                return(CBORObject.FromObject(b1 - (EInteger)b2));
            }
        }
Exemplo n.º 24
0
        public static CBORObject Remainder(CBORObject a, CBORObject b)
        {
            if (a == null)
            {
                throw new ArgumentNullException("a");
            }
            if (b == null)
            {
                throw new ArgumentNullException("b");
            }
            if (a.Type != CBORType.Number)
            {
                throw new ArgumentException("a.Type (" + a.Type +
                                            ") is not equal to " + CBORType.Number);
            }
            if (b.Type != CBORType.Number)
            {
                throw new ArgumentException("b.Type (" + b.Type +
                                            ") is not equal to " + CBORType.Number);
            }
            object objA  = a.ThisItem;
            object objB  = b.ThisItem;
            int    typeA = a.ItemType;
            int    typeB = b.ItemType;

            if (typeA == CBORObject.CBORObjectTypeInteger && typeB ==
                CBORObject.CBORObjectTypeInteger)
            {
                var valueA = (long)objA;
                var valueB = (long)objB;
                return((valueA == Int64.MinValue && valueB == -1) ?
                       CBORObject.FromObject(0) : CBORObject.FromObject(valueA % valueB));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedRational ||
                typeB == CBORObject.CBORObjectTypeExtendedRational)
            {
                ERational e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedRational(objA);
                ERational e2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedRational(objB);
                return(CBORObject.FromObject(e1.Remainder(e2)));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedDecimal ||
                typeB == CBORObject.CBORObjectTypeExtendedDecimal)
            {
                EDecimal e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedDecimal(objA);
                EDecimal e2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedDecimal(objB);
                return(CBORObject.FromObject(e1.Remainder(e2, null)));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedFloat || typeB ==
                CBORObject.CBORObjectTypeExtendedFloat ||
                typeA == CBORObject.CBORObjectTypeDouble || typeB ==
                CBORObject.CBORObjectTypeDouble ||
                typeA == CBORObject.CBORObjectTypeSingle || typeB ==
                CBORObject.CBORObjectTypeSingle)
            {
                EFloat e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedFloat(objA);
                EFloat e2 = CBORObject.GetNumberInterface(typeB).AsExtendedFloat(objB);
                return(CBORObject.FromObject(e1.Remainder(e2, null)));
            }
            else
            {
                EInteger b1 = CBORObject.GetNumberInterface(typeA).AsEInteger(objA);
                EInteger b2 = CBORObject.GetNumberInterface(typeB).AsEInteger(objB);
                return(CBORObject.FromObject(b1 % (EInteger)b2));
            }
        }
Exemplo n.º 25
0
        public static CBORObject Divide(CBORObject a, CBORObject b)
        {
            if (a == null)
            {
                throw new ArgumentNullException("a");
            }
            if (b == null)
            {
                throw new ArgumentNullException("b");
            }
            if (a.Type != CBORType.Number)
            {
                throw new ArgumentException("a.Type (" + a.Type +
                                            ") is not equal to " + CBORType.Number);
            }
            if (b.Type != CBORType.Number)
            {
                throw new ArgumentException("b.Type (" + b.Type +
                                            ") is not equal to " + CBORType.Number);
            }
            object objA  = a.ThisItem;
            object objB  = b.ThisItem;
            int    typeA = a.ItemType;
            int    typeB = b.ItemType;

            if (typeA == CBORObject.CBORObjectTypeInteger && typeB ==
                CBORObject.CBORObjectTypeInteger)
            {
                var valueA = (long)objA;
                var valueB = (long)objB;
                if (valueB == 0)
                {
                    return((valueA == 0) ? CBORObject.NaN : ((valueA < 0) ?
                                                             CBORObject.NegativeInfinity : CBORObject.PositiveInfinity));
                }
                if (valueA == Int64.MinValue && valueB == -1)
                {
                    return(CBORObject.FromObject(valueA).Negate());
                }
                long quo = valueA / valueB;
                long rem = valueA - (quo * valueB);
                return((rem == 0) ? CBORObject.FromObject(quo) :
                       CBORObject.FromObject(
                           ERational.Create(
                               (EInteger)valueA,
                               (EInteger)valueB)));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedRational ||
                typeB == CBORObject.CBORObjectTypeExtendedRational)
            {
                ERational e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedRational(objA);
                ERational e2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedRational(objB);
                return(CBORObject.FromObject(e1.Divide(e2)));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedDecimal ||
                typeB == CBORObject.CBORObjectTypeExtendedDecimal)
            {
                EDecimal e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedDecimal(objA);
                EDecimal e2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedDecimal(objB);
                if (e1.IsZero && e2.IsZero)
                {
                    return(CBORObject.NaN);
                }
                EDecimal eret = e1.Divide(e2, null);
                // If either operand is infinity or NaN, the result
                // is already exact. Likewise if the result is a finite number.
                if (!e1.IsFinite || !e2.IsFinite || eret.IsFinite)
                {
                    return(CBORObject.FromObject(eret));
                }
                ERational er1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedRational(objA);
                ERational er2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedRational(objB);
                return(CBORObject.FromObject(er1.Divide(er2)));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedFloat || typeB ==
                CBORObject.CBORObjectTypeExtendedFloat ||
                typeA == CBORObject.CBORObjectTypeDouble || typeB ==
                CBORObject.CBORObjectTypeDouble ||
                typeA == CBORObject.CBORObjectTypeSingle || typeB ==
                CBORObject.CBORObjectTypeSingle)
            {
                EFloat e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedFloat(objA);
                EFloat e2 = CBORObject.GetNumberInterface(typeB).AsExtendedFloat(objB);
                if (e1.IsZero && e2.IsZero)
                {
                    return(CBORObject.NaN);
                }
                EFloat eret = e1.Divide(e2, null);
                // If either operand is infinity or NaN, the result
                // is already exact. Likewise if the result is a finite number.
                if (!e1.IsFinite || !e2.IsFinite || eret.IsFinite)
                {
                    return(CBORObject.FromObject(eret));
                }
                ERational er1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedRational(objA);
                ERational er2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedRational(objB);
                return(CBORObject.FromObject(er1.Divide(er2)));
            }
            else
            {
                EInteger b1 = CBORObject.GetNumberInterface(typeA).AsEInteger(objA);
                EInteger b2 = CBORObject.GetNumberInterface(typeB).AsEInteger(objB);
                if (b2.IsZero)
                {
                    return(b1.IsZero ? CBORObject.NaN : ((b1.Sign < 0) ?
                                                         CBORObject.NegativeInfinity : CBORObject.PositiveInfinity));
                }
                EInteger bigrem;
                EInteger bigquo;
                {
                    EInteger[] divrem = b1.DivRem(b2);
                    bigquo = divrem[0];
                    bigrem = divrem[1];
                }
                return(bigrem.IsZero ? CBORObject.FromObject(bigquo) :
                       CBORObject.FromObject(ERational.Create(b1, b2)));
            }
        }
Exemplo n.º 26
0
        public static CBORObject Multiply(CBORObject a, CBORObject b)
        {
            if (a == null)
            {
                throw new ArgumentNullException("a");
            }
            if (b == null)
            {
                throw new ArgumentNullException("b");
            }
            if (a.Type != CBORType.Number)
            {
                throw new ArgumentException("a.Type (" + a.Type +
                                            ") is not equal to " + CBORType.Number);
            }
            if (b.Type != CBORType.Number)
            {
                throw new ArgumentException("b.Type (" + b.Type +
                                            ") is not equal to " + CBORType.Number);
            }
            object objA  = a.ThisItem;
            object objB  = b.ThisItem;
            int    typeA = a.ItemType;
            int    typeB = b.ItemType;

            if (typeA == CBORObject.CBORObjectTypeInteger && typeB ==
                CBORObject.CBORObjectTypeInteger)
            {
                var  valueA = (long)objA;
                var  valueB = (long)objB;
                bool apos   = valueA > 0L;
                bool bpos   = valueB > 0L;
                if (
                    (apos && ((!bpos && (Int64.MinValue / valueA) > valueB) ||
                              (bpos && valueA > (Int64.MaxValue / valueB)))) ||
                    (!apos && ((!bpos && valueA != 0L &&
                                (Int64.MaxValue / valueA) > valueB) ||
                               (bpos && valueA < (Int64.MinValue / valueB)))))
                {
                    // would overflow, convert to EInteger
                    var bvalueA = (EInteger)valueA;
                    var bvalueB = (EInteger)valueB;
                    return(CBORObject.FromObject(bvalueA * (EInteger)bvalueB));
                }
                return(CBORObject.FromObject(valueA * valueB));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedRational ||
                typeB == CBORObject.CBORObjectTypeExtendedRational)
            {
                ERational e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedRational(objA);
                ERational e2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedRational(objB);
                return(CBORObject.FromObject(e1.Multiply(e2)));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedDecimal ||
                typeB == CBORObject.CBORObjectTypeExtendedDecimal)
            {
                EDecimal e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedDecimal(objA);
                EDecimal e2 =
                    CBORObject.GetNumberInterface(typeB).AsExtendedDecimal(objB);
                return(CBORObject.FromObject(e1.Multiply(e2)));
            }
            if (typeA == CBORObject.CBORObjectTypeExtendedFloat || typeB ==
                CBORObject.CBORObjectTypeExtendedFloat ||
                typeA == CBORObject.CBORObjectTypeDouble || typeB ==
                CBORObject.CBORObjectTypeDouble ||
                typeA == CBORObject.CBORObjectTypeSingle || typeB ==
                CBORObject.CBORObjectTypeSingle)
            {
                EFloat e1 =
                    CBORObject.GetNumberInterface(typeA).AsExtendedFloat(objA);
                EFloat e2 = CBORObject.GetNumberInterface(typeB).AsExtendedFloat(objB);
                return(CBORObject.FromObject(e1.Multiply(e2)));
            }
            else
            {
                EInteger b1 = CBORObject.GetNumberInterface(typeA).AsEInteger(objA);
                EInteger b2 = CBORObject.GetNumberInterface(typeB).AsEInteger(objB);
                return(CBORObject.FromObject(b1 * (EInteger)b2));
            }
        }
Exemplo n.º 27
0
 public ERational AsERational(object obj)
 {
     return(ERational.FromEDecimal((EDecimal)obj));
 }
Exemplo n.º 28
0
 public ERational AsERational(object obj)
 {
     return(ERational.FromInt64((long)obj));
 }
Exemplo n.º 29
0
 private static decimal ExtendedRationalToDecimal(ERational
                                                  extendedNumber)
 {
     return((decimal)extendedNumber);
 }
Exemplo n.º 30
0
 public static ExtendedRational ToLegacy(ERational er)
 {
     return(ExtendedRational.ToLegacy(er));
 }