Я и моя докторская степень. студент столкнулся с проблемой в контексте анализа физических данных, и мне может пригодиться некоторое понимание. У нас есть код, который анализирует данные одного из экспериментов на БАК и дает невоспроизводимые результаты. В частности, результаты вычислений, полученные из одного и того же двоичного файла, запущенного на одной и той же машине, могут различаться между последовательными запусками. Мы знаем о многих различных источниках невоспроизводимости, но исключили обычные подозреваемые.
Мы отследили проблему до невоспроизводимости (двойной точности) операций сравнения с плавающей запятой при сравнении двух чисел, которые номинально имеют одинаковое значение. Иногда это может происходить в результате предыдущих шагов анализа. Мы только что нашли пример, который проверяет, меньше ли число 0,3 (обратите внимание, что мы НИКОГДА не проверяем равенство между плавающими значениями). Оказывается, из-за геометрии детектора вычисление могло иногда давать результат, равный точно 0,3 (или его ближайшее представление с двойной точностью).
Мы хорошо знаем о ловушках при сравнении чисел с плавающей запятой, а также о том, что избыточная точность в FPU может повлиять на результаты сравнения. Вопрос, на который я хотел бы получить ответ, звучит так: «Почему результаты невоспроизводимы?» Это потому, что загрузка регистра FPU или другие инструкции FPU не очищают лишние биты и, таким образом, «остаточные» биты от предыдущих вычислений влияют на результаты? (это кажется маловероятным) Я видел предложение на другом форуме, что переключение контекста между процессами или потоками также может вызвать изменение результатов сравнения с плавающей запятой из-за того, что содержимое FPU хранится в стеке и, следовательно, усекается. Буду признателен за любые комментарии по поводу этих = или других возможных объяснений.
volatile
. Это немного снизит производительность, так как принудительно будет проходить кеш L1 (и если есть ложное совместное использование, это может закончиться переходом к кешу L2-L3). - person David Rodríguez - dribeas   schedule 16.02.2011