2010-02-25 27 views
6

Tengo una aplicación escrita en C# que también invoca algún código C. El código C# recibe un doble como entrada, realiza algunos cálculos en él, lo pasa a la capa nativa que realiza sus propios cálculos y luego vuelve a la capa C#.¿Puede un cálculo de coma flotante diferir en diferentes procesadores? (+ pasar dobles entre C# y C)

Si ejecuto el mismo exe/dlls en diferentes máquinas (todas ellas son x64 por Intel), ¿es posible que el resultado final que obtengo sea diferente en diferentes máquinas?

+2

Pregunta interesante ... especialmente para aquellos que recuerdan el infame error Pentium FDIV en el procesador Pentium original. – Nick

Respuesta

4

Si usa el mismo ejecutable (s), los resultados deberían ser los mismos. Sin embargo, vale la pena señalar que los cálculos de coma flotante suelen ser altamente personalizables por una serie de configuraciones persistentes (modo infinito, modo de redondeo, etc.). Esto significa que la misma instrucción de coma flotante puede producir resultados diferentes según la combinación actual de configuraciones. Si su aplicación se asegura de que todos estos ajustes se restablecen a los mismos valores al comienzo de la ejecución, los resultados deberían ser los mismos. Sin embargo, si algunas de estas configuraciones no se reinician, o dependen de parámetros externos (como variables de entorno), entonces en algunas circunstancias puede terminar observando resultados diferentes en diferentes máquinas.

+0

¿qué tipo de variables de entorno podrían afectar los cálculos de coma flotante? –

+0

@opc: Esa sería la cuestión del cargador de aplicaciones específico del sistema operativo así como del código de inicio de la aplicación. Solo digo que, dado que los cálculos de coma flotante se ven afectados por configuraciones persistentes (aplicación global), la configuración inicial de estas configuraciones es importante. Y podría depender de absolutamente cualquier cosa, incluidas las variables de entorno. – AnT

0

La mayoría del hardware moderno es estandarizada, como es la definición del doble. Puede verificar que ambos estén usando el mismo tipo al verificar la huella de memoria de cada variable, por ejemplo, sizeof (x).

También debería haber alguna información para sondear en float.h.

Por lo que recuerdo, int tiende a ser más problemático en términos de consistencia. Algunos son por defecto de 2 bytes, otros de 4, pero siempre se puede usar de largo para garantizar tamaños.

Cuestiones relacionadas