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 resposta

Tenho 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

Esse comportamento é "esperado", não há garantia de ter o mesmo resultado em algumas situaçõexiste algum sinalizador do compilador que possa corrigir iss Ou preciso arredondar meu resultado para terminar com o mesmo nas duas plataformas? Então, qual seria a boa estratégia para arredondar? Como o arredondamento abreviado no e-20 perderia muitas informações se a entradavar 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.

questionAnswers(1)

yourAnswerToTheQuestion