Размышление под прицелом снайперов, гуляющих по крыше...

May 27, 2009 17:14

Такого я ещё не видел. Есть библиотека NaviMath, которую я написал лет 7 назад. Все эти годы она трудилась на тысячах кораблей по всему миру и практически не менялась. Казалось бы, все баги должны были быть из неё давно вычищены...
Но вчера мне показали пример, в котором происходит зацикливание в одной из функций библиотеки. Воспроизвёл пример у себя - всё работает нормально, не зацикливается. А в составе продукта тот же самый код на тех же (до 15-го знака после запятой) данных - зацикливается!
Не поверив своим глазам, запускаю параллельно 2 отладчика: моего отдельно стоящего примера и продукта. И вижу, что уже на первом же по логике работы алгоритма делении вещественных чисел в продукте получается результат, который отличается от "эталонного" где-то в 6-7 знаке. Дальше погрешность накапливается, и в итоге не выполняется условие выхода из цикла "погрешность меньше EPS".
Теперь вот сижу и думаю, как такое может быть. Пришла в голову интересная мысль. Я вспомнил, что когда писали NaviMath, в одном месте мы для оптимизации приведение double к int заменили асемблерной функцией, которая работала раз в 10 быстрее, но кое-что не делала. Неужели её вызов приводит к тому, что так падает точность вычислений? И почему за 7 лет это ни разу не было обнаружено? Может, процессоры стали другие?

Работа

Previous post Next post
Up