Как убедиться, что разные результаты вызваны различиями в обработке чисел с плавающей запятой?

Я преобразовал относительно простой алгоритм, который выполняет большое количество вычислений над числами типа double из C++ в Java, однако запустив алгоритм на двух платформы, но одна и та же машина дает немного разные результаты. Алгоритм умножает и суммирует множество двойных и целых чисел. Я привожу целые числа к удвоению в алгоритме Java; алгоритм C не выполняет приведение типов.

Например, за один прогон я получаю результаты:

  • (Java) 64684970
  • (C++) 65296408

(Печатается без учета знаков после запятой)

Естественно, может быть ошибка в моем алгоритм, однако, прежде чем я начну тратить время на отладку, возможно ли, что разница может быть объяснена разной обработкой с плавающей запятой в C++ и Java? Если да, могу ли я доказать, что проблема именно в этом?


Обновление — место, где различаются типы, — это умножение двух целых чисел, которое затем прибавляется к промежуточному итогу удвоения. Изменив код C, в настоящее время в обоих:

mydouble += (double)int1 * (double)int2

6
задан brabster 1 March 2012 в 15:40
поделиться