Подписанный ноль linux vs windows - PullRequest
6 голосов
/ 04 декабря 2011

Я запускаю программу на C ++ в Windows и Linux. выход должен быть идентичным. Я пытаюсь убедиться, что единственные различия - это реальные различия, противоположные рабочим различиям. до сих пор я позаботился обо всех различиях, которые могут быть вызваны \ r \ n различиями но есть одна вещь, которую я не могу понять.

в окнах ставится 0,000, а в Linux это -0,000

Кто-нибудь знает, что может быть, что имеет значение?

1007 * спасибо *

Ответы [ 3 ]

7 голосов
/ 04 декабря 2011

Вероятно, это связано с различиями в том, как оптимизатор оптимизирует некоторые вычисления FP (которые можно настраивать - см., Например, здесь ); в одном случае вы получите значение чуть меньше 0, в другом чуть больше. Оба значения на выходе округляются до 0.000, но они сохраняют свой «настоящий» знак.

1 голос
/ 04 декабря 2011

Если не использовать (небезопасные) флаги, такие как -ffast-math, компилятор ограничен в предположениях, которые он может сделать, когда ' оптимизирует ' арифметику IEEE-754.Сначала убедитесь, что на обеих платформах используется одинаковое округление.

Также, если возможно, проверьте, что они используют один и тот же модуль с плавающей запятой.т.е. SSE против FPU на x86.Последнее может быть проблемой с реализациями функций математической библиотеки - особенно тригонометрических / трансцендентных функций.

1 голос
/ 04 декабря 2011

Поскольку в формате IEEE с плавающей запятой бит знака отделен от значения, у вас есть два разных значения: 0, положительное и отрицательное. В большинстве случаев это не имеет значения; оба ноля будут сравниваться одинаково, и они действительно описывают одно и то же математическое значение (математически 0 и -0 одинаковы). Разница может быть значительной, если у вас недостаточный уровень и вам необходимо знать, произошел ли недостаточный результат из положительного или из отрицательного значения. Также, если вы поделите на 0, знак бесконечности, который вы получите, зависит от знака 0 (то есть 1 / + 0,0 дает + Inf, но 1 / -0,0 дает -Inf). Другими словами, скорее всего, это ничего не изменит для вас.

Обратите внимание, что другой вывод не обязательно означает, что само число отличается. Вполне возможно, что значение в Windows также равно -0.0, но процедура вывода в Windows не различает +0.0 и -0.0 (в конце концов, они равны).

...