Skip to content

Unity 5+ Cuidado ao Comparar Pontos Flutuantes :(

Spoilers: comparar 2 pontos flutuantes diretamente com ==, >, <, etc. não é legal!

Por questões de hardware, o computador sempre carrega algum erro em operações de ponto flutuante (que é mais notado quanto mais vc vai fazendo operações em cima do valor de ponto flutuante). Isso é chamado de erro de mantissa, que vocês podem procurar mais em livros de calculo numérico, ou em links como esse:
http://producao.virtual.ufpb.br/…/livro.chunked/ch03s07.html

Por isso é uma boa prática de programação quando comparar valores de ponto flutuante usar um patamar de erro (ou threshold) que a gente chama normalmente de epsilon. Esse valor vai ser a precisão que você quer na operação, e vai variar de acordo com a necessidade do seu código. Por isso que eu e mais alguns sugerimos usar:
|A-B| > epsilon, ou A-B > epsilon

Pode parecer óbvio que A > B funcionaria, mas para alguns casos não, e daria errado. Esse link que o Fernand Rossa divulgou fala de um jeito mais resumido:
https://msdn.microsoft.com/en-us/library/c151dt3s.aspx
Mas vcs podem ver um exemplo nesse link, também da documentação do C#, do porque pode dar errado:
https://msdn.microsoft.com/…/library/ya2zha7s(v=vs.110).aspx

É um problema muito importante para computação que necessita de precisão muito grande de resultados, como problemas de engenharia. Mas geralmente na área de jogos ele acaba não sendo tão relevante, e por isso muita gente acaba não sabendo disso.

Informativo de Leonardo Pereira: https://www.facebook.com/ltorpereira?hc_ref=ARS69EpNMLAV9EGZCS35pTwcmLiYwNg2Xou5_U06NEfek6oEchdWO94nHbQYJffYMzc
No post: https://www.facebook.com/groups/unity3dbr/permalink/1780010805351473/
No fórum da Unity Brasil: https://www.facebook.com/groups/unity3dbr/?hc_ref=ARS69EpNMLAV9EGZCS35pTwcmLiYwNg2Xou5_U06NEfek6oEchdWO94nHbQYJffYMzc

2 Comments

  1. A causa da GL e querer representar orientacao como tres rotacoes, usando angulos de Euler. Uma possivel solucao e, portanto, representar a orientacao de outra forma. Isto poderia ser feito com uma matriz de rotacao, um quaterniao, ou outra representacao similar, que trate a orientacao como um valor, em vez de tres valores separados e relacionados. Dada tal representacao, o usuario armazena a orientacao como um valor. Para aplicar alteracoes angulares, a orientacao e modificada por um angulo delta ao redor de um eixo de rotacao. A orientacao resultante deve ser normalizada para evitar que erros de ponto flutuante se acumulem depois de transformacoes sucessivas. Para matrizes, normalizar o resultado requer a conversao da matriz em sua mais proxima representacao ortonormal. Para quaternioes, normalizacao requer a realizacao de normalizacao de quaternioes .

  2. Obrigado pelos pontos levantados em seu comentário 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.