Qué podría causar que un proceso determinista genere errores de coma flotante

Tener ya leer estopregunt Estoy razonablemente seguro de que un proceso dado que utiliza aritmética de coma flotante con la misma entrada (en el mismo hardware, compilado con el mismo compilador) debe ser determinista. Estoy viendo un caso en el que esto no es cierto e intento determinar qué pudo haber causado esto.

He compilado un ejecutable y lo estoy alimentando exactamente con los mismos datos, ejecutándome en una sola máquina (no multiproceso), pero obtengo errores de aproximadamente 3.814697265625e-06 que, después de buscar cuidadosamente en Google, es realmente igual a 1/4 ^ 9 = 1/2 ^ 18 = 1/262144. que está bastante cerca del nivel de precisión de un número de coma flotante de 32 bits (aproximadamente 7 dígitos según wikipedia)

Mi sospecha es que tiene algo que ver con las optimizaciones que se han aplicado al código. Estoy usando el compilador Intel C ++ y he convertido la especulación de coma flotante en rápida en lugar de segura o estricta. ¿Podría esto hacer que un proceso de coma flotante no sea determinista? ¿Hay otras optimizaciones, etc. que podrían conducir a este comportamiento?

EDITA: Según la sugerencia de Pax, volví a compilar el código con especulación de coma flotante convertida en segura y ahora obtengo resultados estables. Esto me permite aclarar esta pregunta: ¿qué hace realmente la especulación de punto flotante y cómo puede hacer que el mismo binario (es decir, una compilación, múltiples ejecuciones) genere resultados diferentes cuando se aplica exactamente a la misma entrada?

@ Ben Estoy compilando usando Intel (R) C ++ 11.0.061 [IA-32] y estoy corriendo en un procesador Intel quadcore.

Respuestas a la pregunta(4)

Su respuesta a la pregunta