Qual é a melhor maneira de explicar aos clientes o problema de arredondamento de ponto flutuante ?
eu sei
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
bem como as entradas nas Perguntas frequentes sobre C ++ e várias outras páginas destinadas a desenvolvedores e cientistas, mas existe uma página da web, artigo ou explicação, destinada a clientes "regulares" com conhecimentos matemáticos ou científicos limitados? (para o qual as referências acima não são válidas).
Se ele foi mantido ou provém de uma instituição ou corporação bem conhecida e reconhecida, tanto melhor, já que, como alguns de vocês podem ter experimentado, pode ser um pouco complicado explicar isso por conta própria.
customer-relations
Eric Grange
fonte
fonte
Respostas:
Acho que uma maneira simples de explicar isso é demonstrá- lo. Discuta como a divisão
x
por um número e a multiplicação pelo mesmo número devem retornar vocêx
novamente - peça ao cliente que concorda que esse sempre deve ser o caso. Então faça o antigo(100 / 3) * 3
em uma calculadora; mostre que o valor, como você esperaria, não retorna a 100. Quando a maioria das pessoas vê matemática aparentemente simples "quebrando", então tende a "pegar" o perigo de números de ponto flutuante onde a precisão é importante (embora de uma maneira intuitiva maneira, e não no nível mais baixo para o qual você aponta o artigo).Infelizmente, hoje em dia, a maioria das calculadoras meio decentes (certamente todas as científicas que já vi e mais algumas básicas) conseguem lidar com isso - presumo que elas estejam armazenando dígitos extras além do que pode ser exibido e arredondado - o mesmo acontece com verifique o quão inteligente é sua calculadora antes de fazer isso na frente de seu cliente.
fonte
Eu não acho que existem atalhos. Você precisa:
Ou, se isso for necessário demais, você precisará apenas:
Talvez um exemplo com números irracionais ajuda (mesmo que as questões de ponto flutuante se aplicam aos números racionais também):
sqrt(2) ~ 1.414
. Então1.414^2 = 1.999396
. Não importa quantos dígitos você pegue, você nunca voltará ao original2
. Ok, quatro dígitos significativos corretos podem ser aceitáveis, mas considere o que acontece quando esse tipo de "erro de arredondamento" se acumula. É aí que está o verdadeiro perigo.fonte
Primeiro, determine o que eles estão reclamando. As transações financeiras devem ser feitas com precisão, com o número certo de casas decimais e as regras de arredondamento corretas. Isso normalmente significa manter um número inteiro de unidades monetárias e garantir que a aritmética seja executada corretamente.
Como alternativa, eles podem estar reclamando de exibições superexatas, e reduzir o número de dígitos significativos emitidos pode ser tudo o que é necessário.
Para números em geral, você pode sempre tentar obter um decimal x de três dígitos, de modo que x * 3 seja 10. Isso mostra os princípios básicos.
Existem dois problemas restantes. Uma é que certos números podem ser expressos exatamente em decimal, mas não em binários (3,15, digamos). Isso vai ser difícil de explicar para pessoas não técnicas, e sua melhor aposta é tentar evitá-lo, não fornecendo dígitos significativos o suficiente para que ele apareça. O outro é o cliente que sabe um pouco, o suficiente para saber que a aritmética do computador nem sempre é exata e nem o suficiente para perceber que a aritmética decimal nem sempre é exata. Eu argumentei com alguns deles e não tenho nada útil para relatar.
fonte
Os números de ponto flutuante nos computadores usam binário, assim como temos um sistema numérico com colunas de um, dezenas, centenas e décimos, centésimos, os números de ponto flutuante em computadores realmente têm um, dois, quatro e metades, quartos e oitavas colunas. Se o cliente estiver familiarizado com pés / polegadas, lembre-o de como você normalmente usa frações de base 2 de polegada para medição.
Agora tente armazenar 10 centavos como uma combinação de metades, quartos, oitavos de um dólar. Simplesmente não funciona:
.00011001100110011. . . ( repete-se infinitamente )
É o mesmo que pegar uma fita métrica imperial padrão e tentar medir um décimo de polegada. Você não pode fazer isso com precisão. Não há representação de 1/10 como X / Y, onde X e Y são números inteiros e Y é uma potência de 2.
É por isso que temos os tipos de dados decimais que usam 4 bits para armazenar cada dígito decimal , então voltamos à representação da base 10. O trade-off está no espaço e no desempenho (cerca de 100% de desempenho, pelo que li).
fonte
Diga a eles que, assim como sua conta bancária não pode conter 4,4423425908459032890413 ... dólares (ou seja, US $ 4,44 ou US $ 4,45, nada no meio), o computador não pode armazenar facilmente um número com precisão arbitrária. Imperfeições de armazenamento levam a imperfeições de cálculos.
(É um pouco trapaceiro, mas deve dar uma idéia do que é o problema.)
fonte
2/3
Peça-lhes que escrevam a resposta exata para dois dividido por 3.
Como a resposta 'continua para sempre', você pode apontar isso.
Usar 1/3 também funcionaria, mas 2/3 é talvez um exemplo um pouco melhor, pois o arredondamento fornece (por exemplo) .6666667, enquanto .3333333 parece que pode ser truncado.
fonte
fonte
Alguns cálculos são feitos de acordo com alguma regra legal. Por exemplo, se você deseja calcular quanto imposto de renda deve ser pago com uma renda tributável anual de 79.245,18 € na Alemanha, existe apenas uma resposta correta. Você acertou ou errou. Se você acertar, não precisa explicar como a aritmética de ponto flutuante funciona. Se você errar, não precisa explicar como a aritmética de ponto flutuante funciona, você deve corrigir o código quebrado.
Às vezes, você exibe resultados que não parecem corretos. Por exemplo, se você converter US $ 13.297,46 em R $ do Reino Unido com dois dígitos decimais e, em seguida, converter esse valor de R $ do Reino Unido em US $, poderá não obter US $ 13.297,46, mas US $ 13.297,45 ou US $ 13.297,47. Isso não tem nada a ver com aritmética de ponto flutuante. É um problema inevitável e é melhor você poder explicar por que é inevitável. (Você também deve saber por que o problema não ocorre ao converter de R $ do Reino Unido para US $ e vice-versa).
Existem outros resultados possíveis que não parecem adequados. Se você converter números em porcentagens, as porcentagens deverão somar 100%, mas talvez não. Se você exibir quatro porcentagens com duas casas decimais, as quatro porcentagens exibidas poderão adicionar até 99,99% ou 100,01%. Nada a ver com aritmética de ponto flutuante. Ainda assim, você deve ser capaz de explicar o porquê.
Em seguida, há situações em que o uso descuidado da aritmética de ponto flutuante leva a resultados inadequados. Por exemplo, a + b + c geralmente não é o mesmo que b + c + a. Se isso causa um problema, não há nada a explicar, é algo que você corrige.
fonte