Explicando a precisão do ponto flutuante para clientes [fechado]


23

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.


1
Eu não me incomoda ...
John Shaft

1
Esta é uma pergunta realmente fantástica, +10 se eu puder. Um problema frequente para desenvolvedores.
Cody Grey

2
Não é um problema de detalhes, está respondendo fi: por que, adicionando números de precisão com dois dígitos decimais, você termina com 5.9999999 e não com 6, e por que precisa especificar a precisão de arredondamento quando é "óbvio" o resultado não deve ser " t tem mais de dois dígitos decimais. Ou por que às vezes 2 menos 2 nem sempre é zero, e não se parece com um tolo enganador ao fazê-lo.
Eric Grange

9
@ Eric Grange: se seus clientes consideram esses problemas de precisão um bug, é um bug e você precisa encontrar uma maneira de corrigi-lo (talvez não usando o float). Eles não se importam com a origem desse problema de precisão. Eles não se preocupam com o funcionamento do seu software. Eles só querem que funcione.
David

3
@ Eric: O uso de ponto flutuante é um detalhe de implementação. Repito minha pergunta, que não pede algo explicado na pergunta e que evidentemente não esclareci (desculpas): qual é o contexto e por que você está discutindo o uso do ponto flutuante com um cliente?
Tom Anderson

Respostas:


8

Acho que uma maneira simples de explicar isso é demonstrá- lo. Discuta como a divisão xpor um número e a multiplicação pelo mesmo número devem retornar você xnovamente - peça ao cliente que concorda que esse sempre deve ser o caso. Então faça o antigo (100 / 3) * 3em 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.


1
Sim, quase todas as calculadoras estão armazenando pelo menos 2 dígitos extras; portanto, é necessário adicionar algumas multiplicações na mistura, o que atrapalha a explicação, e o IME as faz pensar que você está tentando enganá-las. A raiz quadrada requer menos operações, mas a raiz quadrada já está fora do domínio diário dos clientes regulares.
Eric Grange

2
@ Scott Tentei algumas calculadoras aqui, nenhuma exibiu problemas com (100/3) * 3, mesmo (100/3) * 3-100 não exibiram problemas .... O Excel também acerta.
Eric Grange

9
Tome o dinheiro como exemplo, que possui uma precisão limitada perfeita. Explique que você divide um dólar, então cada pessoa ganha 33 centavos e um centavo é perdido no arredondamento. Qualquer um pode se relacionar com isso.
Inca

4
Não se preocupe com a calculadora. Divida 1 por 3 no papel, mantendo três dígitos significativos.
David Thornley

5
@omegacentauri, se você acha que essa explicação ajuda, acho que você não conversa com os clientes com frequência.
jhocking 17/05

5

Eu não acho que existem atalhos. Você precisa:

  • Entenda o que é ponto flutuante e como ele se comporta.

Ou, se isso for necessário demais, você precisará apenas:

  • Aceite que o computador não fornecerá resultados numéricos exatos.

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ão 1.414^2 = 1.999396. Não importa quantos dígitos você pegue, você nunca voltará ao original 2. 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.


2
Eu pessoalmente conheço e entendo, mas para algumas pessoas "ponto flutuante" já é um termo estranho, então você precisa de mais do que explicações matemáticas ou científicas para explicar que o que eles podem calcular corretamente, seus computadores e softwares caros tem problemas para acertar ;) A raiz quadrada também está fora do domínio cotidiano dos clientes regulares.
Eric Grange

5

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.


3

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).


1

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.)


2
Infelizmente, essa explicação não funciona, pois o problema da precisão pode ocorrer ao somar números com todos apenas dois dígitos de precisão.
Eric Grange

1
Dois dígitos decimais . Sim, eu concordo, um cliente curioso encontrará falhas nele. Mas, então, você pode bater-lhes com a discussão da representação binária - eles pediram para ele ;-)
quant_dev

Bem, já tentando explicar o ponto flutuante, eles IME imediatamente começam a pensar que você está tentando enganá-los, o que pode ser aliviado se vier em termos simples e compreensíveis ou de uma instituição ou corporação conhecida. :)
Eric Grange

1
@Eric Math é difícil, vamos jogar beisebol: P
quant_dev 17/05

1
Pergunte se é mais preciso medir algo no 1/10 "mais próximo ou no milímetro mais próximo. O último é mais preciso, mas os objetos que são um múltiplo preciso de 0,1" não serão um múltiplo preciso de 1mm, a menos que também sejam um múltiplo preciso de 5 "(precisamente 127 mm). A adição do tamanho de dois objetos de 2,54 mm medidos até o 0,1" mais próximo resultará em um tamanho combinado de 0,2 "; a adição dos tamanhos arredondados ao milímetro mais próximo resultará em 6 mm, mesmo que o tamanho real deve ser 5,08 milímetros.
supercat

1

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.


0

Ao fazer cálculos, os computadores geralmente usam aproximações para números (como em vez de usar 1000000.7 eles usam 1000000) porque o uso de aproximações é muito mais rápido. O problema disso é que, quando você faz cálculos com aproximações, obtém aproximações. Geralmente isso funciona muito bem, mas às vezes leva a resultados inesperados.


Eu realmente não entendo o que você está dizendo aqui. "Porque usar aproximações é muito mais rápido"? Às vezes, a aritmética inteira é pelo menos tão rápida, e isso é preciso. Às vezes não há alternativa (como imprimir a raiz quadrada de 2).
David Thornley 17/05

Bem, você tenta explicar a um profissional de marketing por que os computadores não podem realmente representar números irracionais, ou basicamente qualquer número no grande esquema das coisas (ah, então você pode dar uma palestra rápida sobre a irracionalidade de \ pi: algo sobre As séries de Fourier podem ser engraçadas). Aproximado é uma palavra que as pessoas podem entender. Você está abordando isso do ponto de vista de alguém que sabe que nem todos os números são iguais.

0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.