Что может вызвать детерминированный процесс для генерации ошибок с плавающей точкой

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

Я скомпилировал исполняемый файл и передал ему те же самые данные, работающие на одной машине (не многопоточной), но я получаю ошибки около 3.814697265625e-06, которые после тщательного поиска, которые я обнаружил, фактически равны 1 / 4 ^ 9 = 1/2 ^ 18 = 1/262144. что довольно близко к уровню точности 32-битного числа с плавающей запятой (приблизительно 7 цифр согласно википедии)

Я подозреваю, что это связано с оптимизацией, которая была применена к коду. Я использую компилятор intel C ++ и превратил спекуляции с плавающей запятой в быстрые, а не в безопасные или строгие. Может ли это сделать процесс с плавающей запятой недетерминированным? Существуют ли другие оптимизации и т. Д., Которые могут привести к такому поведению?

РЕДАКТИРОВАТЬВ соответствии с предложением Пакса я перекомпилировал код с предположениями с плавающей запятой, которые стали безопасными, и теперь я получаю стабильные результаты. Это позволяет мне прояснить этот вопрос - что на самом деле делает спекуляция с плавающей запятой и как это может привести к тому, что один и тот же двоичный файл (то есть одна компиляция, несколько прогонов) генерирует разные результаты при применении к одному и тому же входу?

@Ben Я компилирую с использованием Intel (R) C ++ 11.0.061 [IA-32] и работаю на четырехъядерном процессоре Intel.

Ответы на вопрос(2)

Ваш ответ на вопрос