Beispiel #1
0
        public void FastCos()
        {
            for (double angle = -2 * Math.PI; angle <= 2 * Math.PI; angle += 0.0001)
            {
                var f        = (Fix64)angle;
                var actualF  = MathFix.FastCos(f);
                var expected = (decimal)Math.Cos(angle);
                var delta    = Math.Abs(expected - (decimal)actualF);
                Assert.True(delta <= 50000 * Fix64.Precision, string.Format("Cos({0}): expected {1} but got {2}", angle, expected, actualF));
            }

            foreach (var val in m_testCases)
            {
                var f        = Fix64.FromRaw(val);
                var actualF  = MathFix.FastCos(f);
                var expected = (decimal)Math.Cos((double)f);
                var delta    = Math.Abs(expected - (decimal)actualF);
                Assert.True(delta <= 0.01M, string.Format("Cos({0}): expected {1} but got {2}", f, expected, actualF));
            }
        }
Beispiel #2
0
        public void Acos()
        {
            var maxDelta = 0.00000001m;
            var deltas   = new List <decimal>();

            Assert.Equal(Fix64.Zero, MathFix.Acos(Fix64.One));
            Assert.Equal(MathFix.PIOver2, MathFix.Acos(Fix64.Zero));
            Assert.Equal(MathFix.PI, MathFix.Acos(-Fix64.One));

            // Precision
            for (var x = -1.0; x < 1.0; x += 0.001)
            {
                var xf       = (Fix64)x;
                var actual   = (decimal)MathFix.Acos(xf);
                var expected = (decimal)Math.Acos((double)xf);
                var delta    = Math.Abs(actual - expected);
                deltas.Add(delta);
                Assert.True(delta <= maxDelta, string.Format("Precision: Acos({0}): expected {1} but got {2}", xf, expected, actual));
            }

            for (int i = 0; i < m_testCases.Length; ++i)
            {
                var b = Fix64.FromRaw(m_testCases[i]);

                if (b < -Fix64.One || b > Fix64.One)
                {
                    Assert.Throws <ArgumentOutOfRangeException>(() => MathFix.Acos(b));
                }
                else
                {
                    var expected = (decimal)Math.Acos((double)b);
                    var actual   = (decimal)MathFix.Acos(b);
                    var delta    = Math.Abs(expected - actual);
                    deltas.Add(delta);
                    Assert.True(delta <= maxDelta, string.Format("Acos({0}) = expected {1} but got {2}", b, expected, actual));
                }
            }
            Console.WriteLine("Max error: {0} ({1} times precision)", deltas.Max(), deltas.Max() / Fix64.Precision);
            Console.WriteLine("Average precision: {0} ({1} times precision)", deltas.Average(), deltas.Average() / Fix64.Precision);
        }
Beispiel #3
0
        public void Ln()
        {
            double maxDelta = 0.00000001;

            for (int j = 0; j < m_testCases.Length; ++j)
            {
                var b = Fix64.FromRaw(m_testCases[j]);

                if (b <= Fix64.Zero)
                {
                    Assert.Throws <ArgumentOutOfRangeException>(() => MathFix.Log(b));
                }
                else
                {
                    var expected = Math.Log((double)b);
                    var actual   = (double)MathFix.Log(b);
                    var delta    = Math.Abs(expected - actual);

                    Assert.True(delta <= maxDelta, string.Format("Ln({0}) = expected {1} but got {2}", b, expected, actual));
                }
            }
        }
Beispiel #4
0
        public void MultiplicationTestCases()
        {
            var sw       = new Stopwatch();
            int failures = 0;

            for (int i = 0; i < m_testCases.Length; ++i)
            {
                for (int j = 0; j < m_testCases.Length; ++j)
                {
                    var x        = Fix64.FromRaw(m_testCases[i]);
                    var y        = Fix64.FromRaw(m_testCases[j]);
                    var xM       = (decimal)x;
                    var yM       = (decimal)y;
                    var expected = xM * yM;
                    expected =
                        expected > (decimal)Fix64.MaxValue
                            ? (decimal)Fix64.MaxValue
                            : expected < (decimal)Fix64.MinValue
                                  ? (decimal)Fix64.MinValue
                                  : expected;
                    sw.Start();
                    var actual = x * y;
                    sw.Stop();
                    var actualM  = (decimal)actual;
                    var maxDelta = (decimal)Fix64.FromRaw(1);
                    if (Math.Abs(actualM - expected) > maxDelta)
                    {
                        Console.WriteLine("Failed for FromRaw({0}) * FromRaw({1}): expected {2} but got {3}",
                                          m_testCases[i],
                                          m_testCases[j],
                                          (Fix64)expected,
                                          actualM);
                        ++failures;
                    }
                }
            }
            Console.WriteLine("{0} total, {1} per multiplication", sw.ElapsedMilliseconds, (double)sw.Elapsed.Milliseconds / (m_testCases.Length * m_testCases.Length));
            Assert.True(failures < 1);
        }