public void Invert()
        {
            var maxDelta = 0.001m;

            var deltas = new List <decimal>();

            // Scalability and edge cases
            foreach (var m in testCases)
            {
                Matrix3x3 testCase = m;

                FloatMatrix3x3 floatMatrix = MathConverter.Convert(testCase);
                FloatMatrix3x3 expected;
                FloatMatrix3x3.Invert(ref floatMatrix, out expected);

                Matrix3x3 actual;
                if (float.IsInfinity(expected.M11) || float.IsNaN(expected.M11))
                {
                    expected = new FloatMatrix3x3();
                }

                Matrix3x3.Invert(ref testCase, out actual);
                bool success = true;
                foreach (decimal delta in GetDeltas(expected, actual))
                {
                    deltas.Add(delta);
                    success &= delta <= maxDelta;
                }
                Assert.True(success, string.Format("Precision: Matrix3x3Invert({0}): Expected {1} Actual {2}", testCase, expected, actual));
            }
            output.WriteLine("Max error: {0} ({1} times precision)", deltas.Max(), deltas.Max() / Fix64.Precision);
            output.WriteLine("Average precision: {0} ({1} times precision)", deltas.Average(), deltas.Average() / Fix64.Precision);
        }
        public void BenchmarkAdaptiveInvert()
        {
            var swf = new Stopwatch();
            var swd = new Stopwatch();

            var deltas = new List <decimal>();

            foreach (var m in testCases)
            {
                Matrix3x3 testCase = m;

                for (int i = 0; i < 10000; i++)
                {
                    FloatMatrix3x3 floatMatrix = MathConverter.Convert(testCase);
                    FloatMatrix3x3 expected;
                    swf.Start();
                    FloatMatrix3x3.AdaptiveInvert(ref floatMatrix, out expected);
                    swf.Stop();


                    Matrix3x3 actual;
                    swd.Start();
                    Matrix3x3.AdaptiveInvert(ref testCase, out actual);
                    swd.Stop();

                    foreach (decimal delta in GetDeltas(expected, actual))
                    {
                        deltas.Add(delta);
                    }
                }
            }
            output.WriteLine("Max error: {0} ({1} times precision)", deltas.Max(), deltas.Max() / Fix64.Precision);
            output.WriteLine("Average precision: {0} ({1} times precision)", deltas.Average(), deltas.Average() / Fix64.Precision);
            output.WriteLine("Fix64.AdaptiveInvert time = {0}ms, float.AdaptiveInvert time = {1}ms", swf.ElapsedMilliseconds, swd.ElapsedMilliseconds);
        }
Beispiel #3
0
        public static void Convert(ref Matrix3x3 matrix, out FloatMatrix3x3 floatMatrix)
        {
            floatMatrix.M11 = (float)matrix.M11;
            floatMatrix.M12 = (float)matrix.M12;
            floatMatrix.M13 = (float)matrix.M13;

            floatMatrix.M21 = (float)matrix.M21;
            floatMatrix.M22 = (float)matrix.M22;
            floatMatrix.M23 = (float)matrix.M23;

            floatMatrix.M31 = (float)matrix.M31;
            floatMatrix.M32 = (float)matrix.M32;
            floatMatrix.M33 = (float)matrix.M33;
        }
        decimal[] GetDeltas(FloatMatrix3x3 expected, Matrix3x3 actual)
        {
            decimal[] result = new decimal[9];
            int       i      = 0;

            result[i++] = (decimal)actual.M11 - (decimal)expected.M11;
            result[i++] = (decimal)actual.M12 - (decimal)expected.M12;
            result[i++] = (decimal)actual.M13 - (decimal)expected.M13;

            result[i++] = (decimal)actual.M21 - (decimal)expected.M21;
            result[i++] = (decimal)actual.M22 - (decimal)expected.M22;
            result[i++] = (decimal)actual.M23 - (decimal)expected.M23;

            result[i++] = (decimal)actual.M31 - (decimal)expected.M31;
            result[i++] = (decimal)actual.M32 - (decimal)expected.M32;
            result[i++] = (decimal)actual.M33 - (decimal)expected.M33;

            return(result);
        }