Devo ancora usare il punto fisso per garantire che i computer ottengano lo stesso risultato per le operazioni matematiche?

10

Mi è stato detto che i computer più moderni seguono lo stesso standard in virgola mobile, vuol dire che otterranno tutti la stessa risposta flottante per una determinata operazione matematica se gli input sono gli stessi?

Chiedo perché sto facendo ricerche per creare un gioco RTS su una rete, e sincronizzare centinaia di posizioni delle unità sembra una cattiva strada da percorrere.

Quindi, se invio solo input, devo garantire che tutti i client ottengano lo stesso risultato facendoli eseguire la simulazione da quegli input.

Ho letto che i vecchi giochi RTS usavano l'aritmetica in virgola fissa, ma non so se è ancora richiesto sui computer moderni se tutti rispettano lo stesso standard? Mi è stato anche detto che, sebbene impreciso, il risultato del virgola mobile è deterministico per lo stesso input (che presumo significhi che qualsiasi computer che segue lo stesso standard ottiene lo stesso risultato impreciso?).

I computer hanno ancora deviazioni anche se seguono lo stesso standard di virgola mobile?

Sto scrivendo questo gioco in C #, non sono sicuro che sia importante, pensavo di dirlo comunque.

    
posta WDUK 10.12.2018 - 05:24
fonte

3 risposte

18

Do computers still have deviations even if they follow the same float point standard?

Sfortunatamente sì, specialmente quando usi C # (o un altro linguaggio compilato con JIT). Il problema che si verifica qui è che la fase di compilazione JIT su alcune architetture di processore produce codice che utilizza più registri CPU rispetto ad altre architetture. Ciò può portare a situazioni in cui su alcune macchine, precisione estesa in virgola mobile viene utilizzata per determinate operazioni, mentre su altre macchine non. Questo significa che per ogni calcolo iterativo usando il doppio, c'è la possibilità di produrre diversi errori di arrotondamento accumulati.

Questo non è un problema ipotetico, ho esperienza diretta di tali deviazioni nei moderni software di simulazione ingegneristica, su hardware più o meno moderno. Questo problema rende davvero difficile creare test di regressione affidabili per calcoli in virgola mobile complessi che producono esattamente lo stesso risultato su tutte le macchine coinvolte.

    
risposta data 10.12.2018 - 06:51
fonte
2

Errori in virgola mobile

Ogni numero in virgola mobile accumula l'imprecisione quando viene utilizzato per il calcolo. Questo è un semplice fatto di utilizzare un formato impreciso per calcolare. I calcoli sono anche sensibili all'ordine di calcolo, la commutatività non è garantita, ovvero: (a + b) + c può o non può essere uguale a a + (b + c) .

I processori aggiuntivi non hanno necessariamente la stessa lunghezza di mantissa dello standard di memoria. Questo può generare un comportamento interessante poiché il float 32/64/128 bit funziona occasionalmente come se avessero più bit.

Errori a virgola fissa

Ciò detto l'aritmetica in virgola fissa può anche accumulare errori. La differenza è che i numeri in virgola fissa sono chiari su quale precisione viene persa e, a seconda delle operazioni scelte, è possibile evitare del tutto gli errori di arrotondamento. Sono anche commutativi (a + b) + c = a + (b + c) .

Quali?

Quale da usare dipende interamente dalle proprietà di cui hai bisogno.

Numeri in virgola mobile:

  • fornisce una vasta gamma di valori che diventano molto sottili e ravvicinati e progressivamente distanti agli estremi.
  • sono sensibili all'ordine di calcolo
  • accumula errori di arrotondamento nel tempo.
  • può avere un comportamento erratico a causa della mancata corrispondenza delle dimensioni float hardware / memoria.

Numeri di punti fissi:

  • indica un intervallo più piccolo di numeri con la stessa distanza tra due numeri consecutivi.
  • sono meno sensibili all'ordine di calcolo
  • sono più chiari sugli errori di arrotondamento
  • può essere utilizzato per ridurre al minimo / evitare problemi di arrotondamento.
risposta data 10.12.2018 - 06:39
fonte
-1

C'è la domanda sul perché vorresti garantire risultati identici, poiché i risultati identici non danno alcuna garanzia che i tuoi risultati siano utili .

Potresti avere un algoritmo numericamente instabile che fornisce due risultati identici ma assolutamente privi di senso in computer diversi. Se ci sono differenze, ma i risultati sono gli stessi entro 13 cifre, è molto più affidabile.

Ci sono pochissime situazioni in cui la riproducibilità è davvero importante: in un motore di layout, o compressione / decompressione senza perdita di dati. Usare il punto fisso è molto probabile che sia fuorviante.

    
risposta data 10.12.2018 - 10:33
fonte

Leggi altre domande sui tag