¿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 respuestaTengo 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.
var
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.