Foi-me dito que a maioria dos computadores modernos segue o mesmo padrão de ponto flutuante. Isso significa que todos obterão a mesma resposta flutuante para uma determinada operação matemática, se as entradas forem iguais?
Eu pergunto porque estou pesquisando sobre como criar um jogo RTS em uma rede, e sincronizar centenas de posições da unidade parece um mau caminho a percorrer.
Portanto, se eu enviar apenas apenas entradas, preciso garantir que todos os clientes obtenham o mesmo resultado, solicitando que eles executem a simulação a partir dessas entradas.
Li que os jogos RTS mais antigos usavam aritmética de ponto fixo, mas não sei se isso ainda é necessário nos computadores modernos, se todos seguirem o mesmo padrão? Também me disseram que, embora impreciso, o resultado do ponto flutuante é determinístico para a mesma entrada (o que eu presumo significa que qualquer computador seguindo o mesmo padrão obtém o mesmo resultado impreciso?).
Os computadores ainda têm desvios, mesmo que sigam o mesmo padrão de ponto flutuante?
Estou escrevendo este jogo em c # não tenho certeza se isso importa, mas pensei em mencioná-lo de qualquer maneira.
fonte
Respostas:
Infelizmente, sim, especialmente quando você usa C # (ou outra linguagem compilada JIT). O problema que ocorre aqui é que o estágio de compilação JIT em algumas arquiteturas de processador produz código que usa mais registros de CPU do que em outras arquiteturas. Isso pode levar a situações em que, em algumas máquinas, a precisão estendida do ponto flutuante é usada para determinadas operações, enquanto em outras máquinas não. Isso significa que, para todos os cálculos iterativos usando duplos, existe a chance de produzir diferentes erros de arredondamento acumulados.
Esse não é um problema hipotético, tenho experiência em primeira mão com esses desvios no software de simulação de engenharia contemporâneo, em hardware mais ou menos moderno. Esse problema dificulta a criação de testes de regressão confiáveis para cálculos complexos de ponto flutuante que produzem exatamente o mesmo resultado em todas as máquinas envolvidas.
fonte
FLT_EVAL_METHOD
no ISO C / C ++. Funções transcendentais (por exemplosin
,exp
,log
) são em grande parte não regulamentada tanto pelo padrão de ponto flutuante IEEE e programação padrões de linguagem. Uma atualização simples da versão da biblioteca (por exemplo, uma novaglibc
versão) pode causar resultados diferentes.Erros de ponto flutuante
Todo número de ponto flutuante acumula imprecisão à medida que é usado para o cálculo. Este é um fato simples de usar um formato impreciso para calcular. Os cálculos também são sensíveis à ordem de cálculo, a comutatividade não é garantida, ou seja:
(a + b) + c
pode ou não ser a mesma quea + (b + c)
.Além disso, os processadores não têm necessariamente o mesmo comprimento de mantissa que o padrão de memória. Isso pode gerar um comportamento interessante, pois o flutuador 32/64/128 bits ocasionalmente opera como se tivesse mais bits.
Erros de ponto fixo
Dito isto, a aritmética de ponto fixo também pode acumular erros. A diferença é que os números de pontos fixos são claros sobre a precisão perdida e, dependendo das operações escolhidas, pode evitar erros de arredondamento por completo. Eles também são comutativos
(a + b) + c = a + (b + c)
.Qual?
Qual usar depende inteiramente de quais propriedades você precisa.
Números de ponto flutuante:
Números de ponto fixo:
fonte
(a + b * c) / d - e
. Exceto problemas óbvios comoNaN
divisão por zero ou excesso / excesso, é possível que essa expressão esteja incorreta. Acrescente a isso a impedância entre a memória e o registro em termos de precisão e até mesmo um simples carregamento / armazenamento da memória com o "mesmo" valor de ponto flutuante alterará a resposta.Há a pergunta por que você deseja garantir resultados idênticos, já que resultados idênticos não dão nenhuma garantia de que seus resultados sejam úteis .
Você pode ter um algoritmo numericamente instável que fornece dois resultados idênticos, mas completamente sem sentido, em computadores diferentes. Se houver diferenças, mas os resultados forem os mesmos com 13 dígitos, é muito mais confiável.
Existem muito poucas situações em que a reprodutibilidade é realmente importante: em um mecanismo de layout, ou compactação / descompactação sem perdas. É muito provável que o uso de ponto fixo seja equivocado.
fonte