Я работал над переносом унаследованного проекта с Visual Studio 6 на 2008 год. Пройдя несколько препятствий, я теперь строю и выполняю новый проект. Однако я заметил, что выходные данные из двух версий программы очень немного отличаются, как будто вычисления с плавающей запятой не эквивалентны, несмотря на то, что код один и тот же.
Эти различия обычно начинаются довольно небольшими (<1.0E-6), но накапливаются во многих расчетах до того момента, когда они начинают оказывать существенное влияние на выход. В качестве одного примера я рассмотрел точное хранение с двойной точностью в памяти ключевой переменной после одного из первых шагов вычисления и увидел: </p>
Представление Visual Studio 6:
0x4197D6CC85AC68D9
Десятичный эквивалент:
99988257,4183687120676040649414
Представление Visual Studio 2008:
0x4197D6CC85AC68EB
Десятичный эквивалент:
+99988257,4183689802885055541992
Я пытался отладить это, чтобы отследить, где начинаются различия, но вывод получен из итеративного числового решателя, так что это будет трудоемкий процесс, чтобы отследить это с такой высокой точностью. 1011 *
Кто-нибудь знает о каких-либо ожидаемых различиях между арифметическими операциями двойной точности двух версий компилятора? (Или какие-либо другие идеи о том, что может быть причиной этого?)
На данный момент моим следующим шагом, вероятно, будет попытка создать простое демонстрационное приложение, которое показывает проблему и может быть более легко изучено.
Спасибо!