Стандарты IEEE и C / C ++ оставляют некоторые аспекты математики с плавающей точкой неопределенными. Да, точный результат добавления в число с плавающей точкой определяется, но более сложный расчет - нет. Например, если вы добавите три числа с плавающей запятой, то компилятор может выполнить оценку с точностью с плавающей запятой, двойной точностью или выше. Точно так же, если вы добавите три двойника, то компилятор может выполнить оценку с двойной точностью или выше.
VC ++ по умолчанию устанавливает точность точности FPU на x87 вдвое. Я считаю, что gcc оставляет это с 80-битной точностью. Ни одно из них явно не лучше, но они могут легко дать разные результаты, особенно если в ваших расчетах есть нестабильность. В частности, «крошечный + большой - большой» может дать очень разные результаты, если у вас есть дополнительные биты точности (или если порядок оценки изменяется). Последствия различной промежуточной точности обсуждаются здесь:
http://randomascii.wordpress.com/2012/03/21/intermediate-floating-point-precision/
Проблемы детерминированной плавающей точки обсуждаются здесь:
http://randomascii.wordpress.com/2013/07/16/floating-point-determinism/
Математика с плавающей точкой сложна. Вам нужно выяснить, когда ваши расчеты расходятся, и изучить сгенерированный код, чтобы понять, почему. Только тогда вы сможете решить, какие действия предпринять.