Бывает, что два бага в коде программы компенсируют друг друга. Но делать они этом могут весьма своеобразным образом.
Дано:
1) Функция быстрой сортировки, которая неправильно делает вывод о том, больше одно число, чем другое, меньше или равно. Точнее, она сортирует только если разница между соседними значениями больше единицы (ошибка при приведении типов)
2) Функция синхронной сортировки двух массивов координат (x,y) по координате X, которая вызывает первую функцию. В ней есть ошибка, о которой я напишу ниже.
3) Функция гауссовой фильтрации. В ней всё правильно.
Итак, третья функция работает!
Потом обнаруживается ошибка в первой функции. После её исправления перестаёт работать третья. То есть: при верной функции сортировки гауссова фильтрация не работает. А при неверной -- работает. Как может правильность функции сортировки влиять на фильтрацию, тем более в случае когда мы исправляем ошибку?
Тут выясняется следующее:
а) 2-я функция на самом деле сортирует по игреку О_о.
б) третья функция вызывает вторую для сортировки функции (массива данных), с которой будет осуществляться свёртка исходной функции (массива данных).
в) в этой функции, с которой сворачивают, все значения меньше единицы.
Прозрение!
Неправильная функция сортировки неправильно сортирует по игреку (по неправильной оси) массив, где все значения меньше единицы. Таким образом, они остаются неизменными (сортировку по икс можно было вообще не делать, это была перестраховка). И всё правильно сворачивается.
А когда функция исправлена, она правильно сортирует по неправильной оси и портит данные.
Замечу, что ошибки были вообще из разных категорий и всё равно компенсировали друг друга. Так что необязательно ошибки должны быть "противоположными" (например, два раза изменён знак, вместо того чтобы изменить его 0 раз).