2011-12-04 8 views
6

estoy ejecutando un programa en C++ en windows y en linux. la salida debe ser idéntica. estoy tratando de asegurarme de que las únicas diferencias son diferencias reales que se oponen a las diferencias de funcionamiento del trabajo. Hasta ahora he solucionado todas las diferencias que pueden ser causadas por \ r \ n las diferencias , pero hay una cosa que no puedo entender.Signed zero linux vs windows

en las ventanas hacia fuera puesto hay un 0,000 y en linux es -0,000

¿Alguien sabe lo que puede ser que está haciendo la diferencia?

Gracias

+4

Es difícil de decir ya que no está mostrando un código relevante que arroje :) – favoretti

+0

No importa, independientemente de cómo lo vea. ¿Qué vas a hacer con cero firmado/sin firmar? Añadirlo? Mutliply es? Divide por eso? – FailedDev

+0

@FailedDev: hace la diferencia. Piensa en una función que tiende a 0, puede provenir de la parte negativa del eje y, o de la parte positiva del eje y. – ninjalj

Respuesta

1

Dado que en el formato de coma flotante IEEE el bit de signo está separado del valor, tiene dos valores diferentes de 0, uno positivo y otro negativo. En la mayoría de los casos, no hace la diferencia; ambos ceros se compararán igual, y de hecho describen el mismo valor matemático (matemáticamente, 0 y -0 son lo mismo). Donde la diferencia puede ser significativa es cuando tiene subdesbordamiento y necesita saber si el subdesbordamiento ocurrió de un valor positivo o negativo. Además, si divide por 0, el signo del infinito que obtiene depende del signo del 0 (es decir, 1/+ 0.0 dar + Inf, pero 1/-0.0 da -Inf). En otras palabras, lo más probable es que no haga una diferencia para ti.

Sin embargo, tenga en cuenta que la salida diferente no significa necesariamente que el número en sí sea diferente. Bien podría ser que el valor en Windows sea también -0.0, pero la rutina de salida en Windows no distingue entre +0.0 y -0.0 (después de todo, son iguales).

7

Probablemente se trata de las diferencias en la forma en que el optimizador optimiza algunos cálculos FP (que puede ser configurable - véase, por ejemplo here); en un caso, obtienes un valor ligeramente inferior a 0, en el otro un poco más. Ambos en salida se redondean a 0.000, pero conservan su signo "real".

1

A menos que utilizan banderas (inseguro) como -ffast-math, el compilador está limitado en los supuestos que se puede hacer cuando 'optimizar' IEEE-754 aritmética. Primero compruebe que ambas plataformas estén usando el mismo redondeo.

Además, si es posible, compruebe que están utilizando la misma unidad de coma flotante. es decir, SSE vs FPU en x86. Esto último podría ser un problema con las implementaciones de funciones de la biblioteca matemática, especialmente las funciones trigonométricas/trascendentales.

+1

¿cómo puedo verificar qué unidad de coma flotante están usando? – user690936