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

StackOverflow https://stackoverflow.com/questions/2335529

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top