コード例 #1
0
        public void DoubleDoubleErrorFunctionAgreement()
        {
            foreach (DoubleDouble x in GetRandomPositiveDoubleDoubles(1.0E-2, 1.0E2, 8))
            {
                DoubleDouble xErf         = AdvancedDoubleDoubleMath.Erf(x);
                double       xErfAsDouble = (double)xErf;

                double xAsDouble    = (double)x;
                double xAsDoubleErf = AdvancedMath.Erf(xAsDouble);

                Assert.IsTrue(TestUtilities.IsNearlyEqual(xErfAsDouble, xAsDoubleErf));

                DoubleDouble xErfc = AdvancedDoubleDoubleMath.Erfc(x);
                Assert.IsTrue(IsNearlyEqual(xErf + xErfc, DoubleDouble.One));
            }
        }
コード例 #2
0
        public void DoubleDoubleComparison()
        {
            DoubleDouble x = DoubleDouble.E;
            DoubleDouble y = DoubleDouble.Pi;

            Assert.IsTrue(x <= DoubleDouble.E);
            Assert.IsTrue(x >= DoubleDouble.E);
            Assert.IsFalse(x < DoubleDouble.E);
            Assert.IsFalse(x > DoubleDouble.E);
            Assert.IsTrue(x.CompareTo(x) == 0);

            Assert.IsTrue(x < y);
            Assert.IsTrue(x <= y);
            Assert.IsFalse(x > y);
            Assert.IsFalse(x >= y);
            Assert.IsTrue(x.CompareTo(y) == -1);
        }
コード例 #3
0
        IEnumerable <DoubleDouble> GetRandomPositiveDoubleDoubles(double minimum, double maximum, int n, Random rng = null)
        {
            if (rng == null)
            {
                rng = new Random(1);
            }
            double logMinimum = Math.Log(minimum);
            double logMaximum = Math.Log(maximum);

            for (int i = 0; i < n; i++)
            {
                DoubleDouble x        = DoubleDouble.GetRandomValue(rng);
                DoubleDouble logValue = logMinimum * (1.0 - x) + logMaximum * x;
                DoubleDouble value    = DoubleDouble.Exp(logValue);
                yield return(value);
            }
        }
コード例 #4
0
        public static IEnumerable <DoubleDouble> GetRandomDoubleDoubles(double minimum, double maximum, int n, bool negative = false, Random rng = null)
        {
            if (rng == null)
            {
                rng = new Random(1);
            }
            double logMinimum = Math.Log(minimum);
            double logMaximum = Math.Log(maximum);

            for (int i = 0; i < n; i++)
            {
                DoubleDouble x        = DoubleDouble.GetRandomValue(rng);
                DoubleDouble logValue = logMinimum * (1.0 - x) + logMaximum * x;
                DoubleDouble value    = DoubleDouble.Exp(logValue);
                if (negative && rng.NextDouble() < 0.5)
                {
                    value = -value;
                }
                yield return(value);
            }
        }
コード例 #5
0
        public void DoubleDoubleTrigSpecialCases()
        {
            Assert.IsTrue(DoubleDouble.Sin(0.0) == DoubleDouble.Zero);
            Assert.IsTrue(DoubleDouble.Cos(0.0) == DoubleDouble.One);

            Assert.IsTrue(DoubleDoubleTest.IsNearlyEqual(DoubleDouble.Sin(DoubleDouble.Pi / 6), DoubleDouble.One / 2));
            Assert.IsTrue(DoubleDoubleTest.IsNearlyEqual(DoubleDouble.Cos(DoubleDouble.Pi / 6), DoubleDouble.Sqrt(3) / 2));

            Assert.IsTrue(DoubleDoubleTest.IsNearlyEqual(DoubleDouble.Cos(DoubleDouble.Pi / 5), (1 + DoubleDouble.Sqrt(5)) / 4));

            Assert.IsTrue(DoubleDoubleTest.IsNearlyEqual(DoubleDouble.Sin(DoubleDouble.Pi / 4), DoubleDouble.One / DoubleDouble.Sqrt(2)));
            Assert.IsTrue(DoubleDoubleTest.IsNearlyEqual(DoubleDouble.Cos(DoubleDouble.Pi / 4), DoubleDouble.One / DoubleDouble.Sqrt(2)));

            Assert.IsTrue(DoubleDoubleTest.IsNearlyEqual(DoubleDouble.Cos(DoubleDouble.Pi / 3), DoubleDouble.One / 2));
            Assert.IsTrue(DoubleDoubleTest.IsNearlyEqual(DoubleDouble.Sin(DoubleDouble.Pi / 3), DoubleDouble.Sqrt(3) / 2));

            Assert.IsTrue(DoubleDoubleTest.IsNearlyEqual(DoubleDouble.Sin(DoubleDouble.Pi / 2), DoubleDouble.One));

            Assert.IsTrue(DoubleDoubleTest.IsNearlyEqual(DoubleDouble.Cos(DoubleDouble.Pi), -DoubleDouble.One));

            // Not testing zeros because of need to distingish very small values
        }
コード例 #6
0
        public void AccuracyTest()
        {
            SummaryStatistics s1 = new SummaryStatistics();
            SummaryStatistics s2 = new SummaryStatistics();

            foreach (double omx in TestUtilities.GenerateRealValues(1.0E-24, 1.0, 1000000))
            {
                double x = 1.0 - omx;

                double f1 = Math.Sqrt((1.0 - x) * (1.0 + x));
                double f2 = Math.Sqrt(1.0 - x * x);

                DoubleDouble xe = (DoubleDouble)x;
                DoubleDouble fc = DoubleDouble.Sqrt(DoubleDouble.One - xe * xe);

                double e1 = Math.Abs((double)(f1 - fc));
                double e2 = Math.Abs((double)(f2 - fc));

                s1.Add(e1);
                s2.Add(e2);
            }
        }
コード例 #7
0
        public void DoubleDoubleArithmeticAxioms()
        {
            Random rng = new Random(2);

            foreach (DoubleDouble a in GetRandomDoubleDoubles(1.0E-4, 1.0E4, 8, true, rng))
            {
                Assert.IsTrue(a + DoubleDouble.Zero == a);
                Assert.IsTrue(DoubleDouble.Zero + a == a);

                Assert.IsTrue(a * DoubleDouble.One == a);
                Assert.IsTrue(DoubleDouble.One * a == a);

                DoubleDouble ma = -a;

                Assert.IsTrue(DoubleDouble.Zero - a == ma);
                Assert.IsTrue(-DoubleDouble.One * a == ma);

                Assert.IsTrue(a + ma == DoubleDouble.Zero);
                Assert.IsTrue(ma + a == DoubleDouble.Zero);

                Assert.IsTrue(a + a == 2.0 * a);

                foreach (DoubleDouble b in GetRandomDoubleDoubles(1.0E-4, 1.0E4, 4, true, rng))
                {
                    Assert.IsTrue(a + b == b + a);
                    Assert.IsTrue(a * b == b * a);

                    Assert.IsTrue(a - b == -(b - a));

                    DoubleDouble a_over_b = a / b;
                    DoubleDouble b_over_a = b / a;
                    Assert.IsTrue(IsNearlyEqual(a_over_b * b, a));
                    Assert.IsTrue(IsNearlyEqual(b_over_a * a, b));
                    Assert.IsTrue(IsNearlyEqual(DoubleDouble.One / a_over_b, b_over_a));
                }
            }
        }
コード例 #8
0
        public void DoubleDoubleInfinity()
        {
            // Addition
            Assert.IsTrue(DoubleDouble.PositiveInfinity + DoubleDouble.One == DoubleDouble.PositiveInfinity);
            Assert.IsTrue(DoubleDouble.One + DoubleDouble.NegativeInfinity == DoubleDouble.NegativeInfinity);
            Assert.IsTrue(DoubleDouble.IsNaN(DoubleDouble.NegativeInfinity + DoubleDouble.PositiveInfinity));

            // Subtraction
            Assert.IsTrue(DoubleDouble.One - DoubleDouble.PositiveInfinity == DoubleDouble.NegativeInfinity);
            Assert.IsTrue(DoubleDouble.IsNaN(DoubleDouble.PositiveInfinity - DoubleDouble.PositiveInfinity));

            // Multiplication
            Assert.IsTrue(DoubleDouble.One * DoubleDouble.PositiveInfinity == DoubleDouble.PositiveInfinity);
            Assert.IsTrue(DoubleDouble.One * DoubleDouble.NegativeInfinity == DoubleDouble.NegativeInfinity);
            Assert.IsTrue(DoubleDouble.IsNaN(DoubleDouble.Zero * DoubleDouble.PositiveInfinity));

            // Division
            Assert.IsTrue(DoubleDouble.One / DoubleDouble.Zero == DoubleDouble.PositiveInfinity);
            Assert.IsTrue((-DoubleDouble.One) / DoubleDouble.Zero == DoubleDouble.NegativeInfinity);
            Assert.IsTrue(DoubleDouble.One / DoubleDouble.PositiveInfinity == DoubleDouble.Zero);
            Assert.IsTrue(DoubleDouble.One / DoubleDouble.NegativeInfinity == DoubleDouble.Zero);
            Assert.IsTrue(DoubleDouble.IsNaN(DoubleDouble.Zero / DoubleDouble.Zero));
            Assert.IsTrue(DoubleDouble.IsNaN(DoubleDouble.PositiveInfinity / DoubleDouble.PositiveInfinity));
        }
コード例 #9
0
 public void DoubleDoubleSqrtSpecialValues()
 {
     Assert.IsTrue(DoubleDouble.Sqrt(DoubleDouble.Zero) == DoubleDouble.Zero);
     Assert.IsTrue(DoubleDouble.Sqrt(DoubleDouble.One) == DoubleDouble.One);
 }
コード例 #10
0
 public void DoubleDoubleParseSpecialCases()
 {
     Assert.IsTrue(DoubleDouble.Parse("0.0") == DoubleDouble.Zero);
     Assert.IsTrue(DoubleDouble.Parse("1.0") == DoubleDouble.One);
     Assert.IsTrue(DoubleDouble.Parse("-1.0") == -DoubleDouble.One);
 }