Я и мой доктор философии. студент столкнулся с проблемой в контексте анализа физических данных, что я мог бы использовать некоторое понимание. У нас есть код, который анализирует данные из одного из экспериментов LHC, которые дают неприводимые результаты. В частности, результаты расчетов, полученных из одного и того же двоичного, выполняемого на той же машине, могут различаться между последовательными исполнениями. Мы знаем много разных источников невоспроизводимости, но исключили обычных подозреваемых.
Мы проследили эту проблему до невозможности (с двойной точностью) операций сравнения с плавающей запятой при сравнении двух чисел, которые номинально имеют одинаковое значение. Это может случиться из-за предыдущих шагов анализа. Например, мы просто нашли пример, который проверяет, меньше ли число 0,3 (обратите внимание, что мы НИКОГДА не проверяем равенство между плавающими значениями). Оказывается, из-за геометрии детектора время от времени можно было получить результат, который был бы точно равен 0,3 (или его ближайшему представлению с двойной точностью).
Мы хорошо осведомлены о подводных камнях при сравнении чисел с плавающей запятой, а также о возможности избыточной точности в FPU влиять на результаты сравнения. Вопрос, на который я хотел бы ответить, - "почему результаты невоспроизводимы?" Это связано с тем, что загрузка регистра FPU или другие инструкции FPU не очищают лишние биты, и, таким образом, оставшиеся бит из предыдущих вычислений влияют на результаты? (это кажется маловероятным). Я видел предложение на другом форуме, в котором контекст переключается между процессами или потоками, также может вызвать изменение результатов сравнения с плавающей запятой из-за того, что содержимое FPU хранится в стеке и, следовательно, усечено. Любые комментарии к этим = или другим возможным объяснениям будут оценены.