дебаггер с брейкпоинтами выдает корректные значения, а при автоматической проверке в корне неправильные. Практически все тесты заваливаются. В аналогичном проекте такая проблема не появляется. В чём может заключаться причина такого поведения?
Первый скрин дебага ручками, второй без брейкпоинтов соответственно.
Хей! Кто-нибудь может помочь?
судя по значению у тебя флоат-ебанина
Но там ведь везде использовался double? Просто вообще не могу сообразить, почему ручное прохождение на что-то влияет.
Что значит «в аналогичном проекте не проявляется»? У тебя вообще все тесты херню выдают?
Нет, только там, где числа получены через рандом. Другие тесты с заранее введёнными значениями работают нормально (где-то штук 20).
Кинь код с рандомом. Код самописный или копипаста с ulearn?
Сам код тестов был задан сразу ulearn и шёл вместе с проектом. [TestCase(2, 2)] [TestCase(3, 3)] [TestCase(4, 4)] [TestCase(5, 5)] [TestCase(10, 10)] [TestCase(3, 5)] [Repeat(500)] public void SolveRandomMatrix(int rows, int columns) { var randomMatrix = CreateRandomMatrix(rows, columns); var randomFreeMembers = GetRandomFreeMembers(randomMatrix); var actualSolution = solver.Solve(randomMatrix, randomFreeMembers); // как раз тут уже идет моя реализация solve AssertIsSolution(actualSolution, randomMatrix, randomFreeMembers, 1e-3); } private double[][] CreateRandomMatrix(int rows, int columns, int valuesRange = 1000) { return Enumerable.Range(0, rows).Select(r => CreateRandomRow(columns, valuesRange)).ToArray(); } private double[] GetRandomFreeMembers(double[][] matrix) { const int max = 100; var xs = Enumerable.Range(0, matrix[0].Length).Select(c => random.Next(-max, max)); var freeMembers = matrix.Select(row => row.Zip(xs, (f, s) => f * s).Sum()).ToArray(); return freeMembers; } private static void AssertIsSolution(double[] actual, double[][] matrix, double[] freeMembers, double accuracy) { for (var i = 0; i < matrix.GetLength(0); i++) { var line = matrix[i]; var result = line.Select((element, j) => element * actual[j]).Sum(); Assert.AreEqual(freeMembers[i], result, accuracy, GetAssertionMessage(matrix, freeMembers, actual, i+1)); } } private static string GetAssertionMessage( double[][] sourceMatrix, double[] freeMembers, double[] actualSolution, int equationIndex) { var builder = new StringBuilder("The solution is incorrect!" + Environment.NewLine + Environment.NewLine); builder.Append("Initial matrix:" + Environment.NewLine + sourceMatrix.FormatMatrix() + Environment.NewLine); builder.Append("Free members: [" + string.Join(", ", freeMembers) + "]" + Environment.NewLine); builder.Append("Your solution: [" + string.Join(", ", actualSolution) + "]" + Environment.NewLine); builder.Append($"Equation #{equationIndex} is not satisfied"); return builder.ToString(); }
Делай через pastebin. С телефона читать очень плохо.
И это, код solve то тоже скинь.
https://pastebin.com/iHwj7368 Ладно, проще весь код тестов скинуть, чем обрезать. Нужный тест — SolveRandomMatrix.
https://pastebin.com/PQtXvjkA Он ещё немножко не рефакторился от слова вообще, посему может быть слегка больно.
Ну может тип инт диапозон от -32768 до 32768 и тип переполнение. Юзай двойное слово.
Давай, интересно что получилось
Обсуждают сегодня