Ainda preciso usar o ponto fixo para garantir que os computadores obtenham mais o mesmo resultado nas operações matemáticas?

9

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.

WDUK
fonte
Mesmo que eles fizeram, eu não iria usar flutuadores para que
Telastyn
O que você quer dizer ? Por que não?
WDUK
O uso de carros alegóricos pode ser indesejável de qualquer maneira, porque o comportamento pode depender da posição no mapa. As Terras Distantes do Minecraft eram um exemplo mais notável: o movimento, a renderização e a geração de terrenos ficavam danificados à medida que você se afastava do ponto de desova.
amon

Respostas:

18

Os computadores ainda têm desvios, mesmo que sigam o mesmo padrão de ponto flutuante?

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.

Doc Brown
fonte
Este. Algumas causas principais: O IEEE Std 754 inclui cláusulas opcionais "should" (por exemplo, manuseio de NaN) e permite alternativas de design (por exemplo, detecção de subfluxo). Na medida em que as ligações de linguagem suportam o padrão de ponto flutuante, elas ainda podem dar margem de manobra ao compilador ao avaliar expressões de ponto flutuante, por exemplo, FLT_EVAL_METHODno ISO C / C ++. Funções transcendentais (por exemplo sin, 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 nova glibcversão) pode causar resultados diferentes.
Njuffa
Eu mesmo bati em um jogo. O foguete voava bem no meu laptop, não voava no meu desktop, instalações completamente idênticas.
Loren Pechtel
3

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) + cpode ou não ser a mesma que a + (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:

  • forneça uma vasta gama de valores que se tornam muito finos de perto e se afastam progressivamente nos extremos.
  • são sensíveis à ordem de cálculo
  • acumular erros de arredondamento ao longo do tempo.
  • pode ter um comportamento irregular devido à incompatibilidade de tamanho de flutuador de hardware / memória.

Números de ponto fixo:

  • forneça um intervalo menor de números com a mesma distância entre dois números consecutivos.
  • são menos sensíveis à ordem de cálculo
  • são mais claros sobre erros de arredondamento
  • pode ser trabalhado para minimizar / evitar problemas de arredondamento.
Kain0_0
fonte
11
"Os números de ponto fixo são claras sobre o que precisão está perdido" - pontos flutuantes são claras imprecisões ponto também, a diferença é bastante fixos são mais intuitivos para numeração vida comum
Whatsisname
11
Portanto, apenas o ponto fixo garante que todos os computadores, independentemente do hardware, etc. sofrerão os mesmos erros / perda de precisão?
WDUK
11
Essencialmente, sim, porque você pode especificar que seus números de pontos fixos são 32 ou 64 bits e estarão em todos os sistemas. Os números de ponto flutuante podem ser de 32 ou 64 bits, mas o hardware pode realmente usar 48 ou 96 bits para fazer o cálculo e converter para 32 ou 64 bits no final, resultando em diferenças entre os diferentes tipos de hardware.
user1118321
@whatsisname Enquanto as especificações de ponto flutuante são muito claras, você não pode facilmente dizer-me o que o arredondamento questões que encontrará neste soma: (a + b * c) / d - e. Exceto problemas óbvios como NaNdivisã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.
K10_0
@ Kain0_0: você está certo, não posso dizer com facilidade o que vou encontrar, porque não sou especialista em pontos flutuantes. É exatamente isso que eu quis dizer quando disse "mais intuitivo para a numeração da vida comum". Quando você diz que o ponto fixo é "claro" e o ponto flutuante não é, você faz parecer que os flutuadores são aparentemente imprecisos aleatoriamente.
Whatsisname
-1

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.

gnasher729
fonte
Não neguei sua resposta, mas parece que o caso descrito pelo OP é exatamente "uma daquelas poucas situações em que a reprodutibilidade é realmente importante". Em um jogo RTS, um pequeno erro de arredondamento pode fazer a diferença entre "dois objetos colididos" ou não.
Doc Brown