All good answers.
For really tough bugs, such as numerical routines that run for a long time and get slightly different answers from what they used to get, there is a laborious method that usually works.
Get one foot on each side of the problem and work toward the center.
Like get an older version of the program that got the right answer, and the newer one that doesn't. Incrementally make changes to either one to bring them closer together, still keeping one on one side of the problem, and the other on the other. Eventually, you find the one change that makes the difference.
Like run an older good version of the program under a debugger, and the newer bad version also under a debugger, at the same time. Single step them side-by-side until they do something different. Then repeat, homing in on the step at which they start to differ.
I've found this working-inward-from-both-sides method is applicable to all kinds of difficult problems, not just software.