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); }
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); }