Может ли вычисление с плавающей запятой отличаться на разных процессорах?(+передача двойных значений между C# и C)
-
22-09-2019 - |
Вопрос
У меня есть приложение, написанное на C#, которое также вызывает некоторый код C.Код C# получает некоторый дубль в качестве входных данных, выполняет над ним некоторые вычисления, передает его на собственный уровень, который выполняет над ним свои собственные вычисления, а затем передает обратно на уровень C#.
Если я запускаю одни и те же exe/dll на разных машинах (все они x64 от Intel), возможно ли, что конечный результат, который я получу, будет отличаться на разных машинах?
Решение
Если вы используете одни и те же исполняемые файлы, результаты должны быть такими же.Однако стоит отметить, что вычисления с плавающей запятой обычно легко настраиваются с помощью ряда постоянных настроек (режим бесконечности, режим округления и т. д.).Это означает, что одна и та же инструкция с плавающей запятой может давать разные результаты в зависимости от текущей комбинации настроек.Если ваше приложение гарантирует, что все эти настройки сбрасываются до одних и тех же значений в начале выполнения, то результаты должны быть такими же.Однако если некоторые из этих настроек не сброшены или зависят от внешних параметров (например, переменных среды), то в некоторых случаях вы можете наблюдать разные результаты на разных машинах.
Другие советы
Само оборудование должно делать это одинаково, предполагая, что оно реализует операции с плавающей запятой IEEE, и я думаю, что большинство (все?) так и делают.
Большая часть современного оборудования стандартизирована, как и определение слова «двойной».Вы можете убедиться, что оба используют один и тот же тип, проверив объем памяти каждой переменной - например, sizeof(x).
Также должна быть некоторая информация для опроса в float.h.
Насколько я помню, int имеет тенденцию быть более проблематичным с точки зрения согласованности.Некоторые по умолчанию равны 2 байтам, другие — 4, но вы всегда можете использовать long для обеспечения размеров.