Como devo fazer um teste de igualdade para 80bit ponto flutuante IEEE?

votos
2

relacionado a:

No entanto, com relação a carros alegóricos IEEE 80 bit (ver secção 8.2) em um sistema x86

Em particular, eu gosto da esta implementação usando uma contagem de valores representáveis entre os operandos porque dimensionar por padrão.

Um caso de uso seria para aproximações numéricas, onde dois valores se aproximam uns dos outros e eu preciso verificar para ver se eles estão perto o suficiente.


ps A linguagem de implementação será D, mas eu posso traduzir. Também uma implementação que pode lidar automaticamente qualquer que seja o tipo subjacente é (por exemplo, que apenas 64 bits real era disponível) seria o ideal.

O código atual em uso:

Publicado 10/12/2008 em 05:33
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Desde D tem de reais 80 bits construído em (tanto quanto eu posso dizer), por que você não apenas usar a abordagem padrão de comparar com um valor de epsilon. Isso pode ser um valor fixo se você sabe a faixa áspera com antecedência, como moeda norte-americana:

if (abs (a - b) < 1e-6) // effectively equal

ou um erro relativo aceitável, tal como uma parte por milhão da média:

if (abs (a - b) < ((a + b) / 2) / 1e6) // effectively equal

Tenha em mente que eu não sei D, o código acima é apenas para fins demonstrativos.

Respondeu 10/12/2008 em 07:04
fonte usuário

votos
0

Minha solução atual é

bool Near(real a, real b, int count = 5)
{
    // Returns the number of mantissa bits which are equal in x and y.
    int i = std.math.feqrel!(real)(a,b);
    return i + count >= real.mant_dig;
}

Ele dá o número de bits combinava-miss nas entradas. Não estou bem certo como isso vai funcionar perto de potências de 2.

Respondeu 10/12/2008 em 07:03
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more