Intentando portar código Java a C++ He tropezado con un comportamiento extraño. No puedo obtener una doble adición al trabajo (aunque la opción del compilador/fp: strict, que significa matemática "correcta" de coma flotante, se establece en Visual Studio 2008).¿Por qué los dobles se agregan incorrectamente en un proyecto específico de Visual Studio 2008?
double a = 0.4;
/* a: 0.40000000000000002, correct */
double b = 0.0 + 0.4;
/* b: 0.40000000596046448, incorrect
(0 + 0.4 is the same). It's not even close to correct. */
double c = 0;
float f = 0.4f;
c += f;
/* c: 0.40000000596046448 too */
En un proyecto de prueba diferente que estableció que funciona bien (/ fp: se comporta de acuerdo con los estrictos IEEE754).
Uso de Visual Studio 2008 (estándar) sin optimización y FP: estricto.
¿Alguna idea? ¿Realmente está truncando a las carrozas? Este proyecto realmente necesita el mismo comportamiento tanto en Java como en C++. Obtuve todos los valores leyendo desde la ventana de depuración en VC++.
Solución: _fpreset(); // La idea de Barry Kelly lo resolvió. Una biblioteca estaba estableciendo la precisión de FP en bajo.
¿Se puede publicar un pequeño programa de prueba completo junto con la línea de comando exacta utilizada para compilar (ver ventana de salida, etc.), que demuestra el problema? La única forma en que puedo reproducir es usando 0.0f + 0.4f en su lugar. –
¿Podemos suponer que conoce la imprecisión de los tipos de coma flotante? Tener una precisión de 7 decimales generalmente se considera correcto ya que la precisión de impresión predeterminada es 6. –
@Evan, su ejemplo está desactivado por más de lo que se explicaría por la imprecisión en coma flotante. – Kevin