¿Por qué obtengo un resultado específico de plataforma para std :: exp? [duplicar

Esta pregunta ya tiene una respuesta aquí:

Las matemáticas de punto flotante están rota 28 respuestasMath requisitos de precisión de C y C ++ estándar 1 respuesta

Tengo un programa que daba resultados muy diferentes en Android y Windows. A medida que valido los datos de salida contra un archivo binario que contiene el resultado esperado, la diferencia, incluso si es muy pequeña (problema de redondeo) es molesta y debo encontrar una manera de solucionarlo.

Aquí hay un programa de muestra:

#include <iostream>
#include <iomanip>
#include <bitset>

int main( int argc, char* argv[] )
{
    // this value was identified as producing different result when used as parameter to std::exp function
    unsigned char val[] = {158, 141, 250, 206, 70, 125, 31, 192};

    double var = *((double*)val);

    std::cout << std::setprecision(30);

    std::cout << "var is " << var << std::endl;
    double exp_var = std::exp(var);
    std::cout << "std::exp(var) is " << exp_var << std::endl;
}

En Windows, compilado con Visual 2015, obtengo el resultado:

var is -7.87234042553191493141184764681
std::exp(var) is 0.00038114128472300899284561093161

En Android / armv7, compilado con g ++ NDK r11b, obtengo el resultado:

var is -7.87234042553191493141184764681
std::exp(var) is 0.000381141284723008938635502307335

Así que los resultados son diferentes a partir del e-20:

PC:      0.00038114128472300899284561093161
Android: 0.000381141284723008938635502307335

enga en cuenta que mi programa realiza muchas operaciones matemáticas y solo notéstd::exp produciendo resultados diferentes para la misma entrada ... y solo para algunos valores de entrada específicos (no investigó si esos valores tienen una propiedad similar), para la mayoría de ellos, los resultados son idénticos.

¿Es este tipo de comportamiento "esperado", no hay garantía de tener el mismo resultado en algunas situaciones? ¿Hay algún indicador de compilación que pueda arreglar eso? ¿O necesito redondear mi resultado para terminar con el mismo en ambas plataformas? Entonces, ¿cuál sería la buena estrategia para redondear? Debido a que el redondeo abritrario en e-20 perdería demasiada información si la entradavar en muy pequeño?

Edit: considero que mi pregunta no es un duplicado deLas matemáticas de punto flotante están rota. Obtengo exactamente el mismo resultado en ambas plataformas, solostd::exp para algunos valores específicos produce resultados diferentes.

Respuestas a la pregunta(1)

Su respuesta a la pregunta