Dados dois números de ponto flutuante de precisão dupla, finitos e diferentes de zero x
e y
, é sempre verdade que a igualdade
x * y == ((x * y) / y) * y
mantém a semântica padrão IEEE 754?
Pesquisei programaticamente entre bilhões de possibilidades (inclusive na faixa subnormal) e não consegui encontrar um contraexemplo, mas também não tenho certeza de como provar que a afirmação é verdadeira.
(O que eu sei é que as afirmações mais simples x == (x / y) * y
e x == (x * y) / y
são ambas falsas, pois posso facilmente encontrar contra-exemplos para elas.)
Em precisão dupla (binário64), ou seja, precisão de p = 53 bits, tem-se o seguinte contra-exemplo:
quais saídas
Encontrei esse contra-exemplo fazendo testes exaustivos (a propriedade não depende do expoente de x e y, que pode ser definido como uma constante) em pequenas precisões com GNU MPFR , e encontrei um padrão: na precisão p = 2k+3, o seguinte par escrito na base 2 é um contra-exemplo:
onde
{k}
significa que o dígito é repetido k vezes.Nota: Este problema é um pouco similar ao que gerou um bug no GNU Emacs + Cairo, onde a expressão
((1/s)*b)*s)
está envolvida. Veja meu artigo .