Come posso garantire che i calcoli in virgola mobile in un'applicazione .NET (ad esempio in C#) producano sempre lo stesso risultato bit-esatto? Soprattutto quando si utilizzano versioni diverse di .NET e in esecuzione su piattaforme diverse (x86 vs x86_64). Le inesattezze delle operazioni in virgola mobile non contano.Punto mobile deterministico e .NET
In Java userei strictfp. In C/C++ e in altri linguaggi di basso livello questo problema viene essenzialmente risolto accedendo ai registri di controllo FPU/SSE ma probabilmente non è possibile in .NET.
Anche con il controllo del registro di controllo della FPU, il JIT di .NET genera codice diverso su piattaforme diverse. Qualcosa come HotSpot sarebbe anche peggio in questo caso ...
Perché ne ho bisogno? Sto pensando di scrivere un gioco di strategia in tempo reale (RTS) che dipende in larga misura dalla matematica in virgola mobile e da una simulazione a blocchi. Essenzialmente trasmetterò solo l'input dell'utente attraverso la rete. Questo vale anche per altri giochi che implementano replay memorizzando l'input dell'utente.
Non è un'opzione sono:
- decimali (troppo lento)
- valori virgola fissa (troppo lente e ingombranti quando si utilizza sqrt, sin, cos, tan, atan ...)
- aggiornamento stato attraverso la rete come un FPS: L'invio di informazioni sulla posizione per centinaia o poche migliaia di unità non è un'opzione
Qualche idea?
Se scrivessi la parte critica (simulazione) del gioco in C/C++, allora posso semplicemente scrivere l'intero gioco senza .Net. Forse è il modo "giusto" qui. – user285934
Esaminare la funzionalità C/C++ IJW (It-Just-Works) del compilatore MSVC. Ti consentirà di scrivere ciò che devi scrivere come codice non gestito, e fare il resto come codice gestito per interfacciarsi agevolmente con il resto delle parti gestite del tuo gioco. – Ants