Может ли вычисление с плавающей запятой отличаться на разных процессорах? (+ передача двойников между C # и C)

У меня есть приложение, написанное на C #, которое также вызывает некоторый код C. Код C # получает двойное значение на входе, выполняет над ним некоторые вычисления, передает его на собственный уровень, который выполняет свои собственные вычисления, а затем возвращается обратно на уровень C #.

Если я запускаю одни и те же exe / dll на разных машинах (все они x64 от Intel), возможно ли, что конечный результат, который я получу, будет отличаться на разных машинах?


person Community    schedule 25.02.2010    source источник
comment
Интересный вопрос ... особенно для тех, кто помнит печально известную ошибку Pentium FDIV в оригинальном процессоре Pentium.   -  person Nick    schedule 25.02.2010


Ответы (3)


Если вы используете один и тот же исполняемый файл (ы), результаты должны быть одинаковыми. Однако стоит отметить, что вычисления с плавающей запятой обычно легко настраиваются с помощью ряда постоянных настроек (режим бесконечности, режим округления и т. Д.). Это означает, что одна и та же инструкция с плавающей запятой может давать разные результаты в зависимости от текущей комбинации настроек. Если ваше приложение гарантирует, что все эти настройки сброшены до тех же значений в начале выполнения, то результаты должны быть такими же. Однако, если некоторые из этих настроек не сброшены или зависят от внешних параметров (например, переменных среды), то в некоторых случаях вы можете наблюдать разные результаты на разных машинах.

person AnT    schedule 25.02.2010
comment
какие переменные среды могут повлиять на вычисления с плавающей запятой? - person ; 25.02.2010
comment
@opc: Это будет связано с загрузчиком приложения для конкретной ОС, а также с кодом запуска приложения. Я просто говорю, что, поскольку на вычисления с плавающей запятой влияют постоянные (глобальные для приложения) настройки, первоначальная настройка этих настроек имеет значение. И это может зависеть абсолютно от чего угодно, включая переменные среды. - person AnT; 25.02.2010

Само оборудование должно все делать это одинаково, предполагая, что они реализуют операции с плавающей запятой IEEE, и я думаю, что большинство (все?) Делают.

http://en.wikipedia.org/wiki/IEEE_754-2008

person Svend    schedule 25.02.2010

Большинство современного оборудования стандартизировано, как и определение double. Вы можете проверить, что оба используют один и тот же тип, проверив объем памяти каждой переменной - например, sizeof (x).

Также должна быть некоторая информация для опроса в float.h.

Насколько я помню, int имеет тенденцию быть более проблематичным с точки зрения согласованности. Некоторые по умолчанию - 2 байта, другие - 4, но вы всегда можете использовать long для обеспечения размера.

person James    schedule 25.02.2010