Por que obtenho resultado específico da plataforma para std :: exp? [duplicado
Esta pergunta já tem uma resposta aqui:
A matemática do ponto flutuante está quebrada? 28 respostasequisitos de precisão de matemática do padrão C e C 1 respostaTenho um programa que apresentava resultados ligeiramente diferentes no Android e Windows. Como eu valido os dados de saída em um arquivo binário que contém o resultado esperado, a diferença, mesmo que muito pequena (problema de arredondamento), seja irritante e eu preciso encontrar uma maneira de corrigi-l
Aqui está um exemplo de programa:
#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;
}
o Windows, compilado com o Visual 2015, recebo a saída:
var is -7.87234042553191493141184764681
std::exp(var) is 0.00038114128472300899284561093161
No Android / armv7, compilado com g ++ NDK r11b, recebo a saída:
var is -7.87234042553191493141184764681
std::exp(var) is 0.000381141284723008938635502307335
Então, os resultados são diferentes a partir do e-20:
PC: 0.00038114128472300899284561093161
Android: 0.000381141284723008938635502307335
Note que meu programa faz muitas operações matemáticas e eu só noteistd::exp
produzindo resultados diferentes para a mesma entrada ... e apenas para alguns valores de entrada específicos (não investigou se esses valores estão tendo uma propriedade semelhante), para a maioria deles, os resultados são idêntico
var
em muito pequeno?Edit: considero que minha pergunta não é uma duplicata de A matemática do ponto flutuante está quebrada?. Recebo exatamente o mesmo resultado nas duas plataformas, apenasstd::exp
para alguns valores específicos produz resultados diferentes.