¿Cómo puedo garantizar que los cálculos de punto flotante en una aplicación .NET (digamos en C#) siempre produzcan el mismo resultado de bit exacto? Especialmente cuando se usan diferentes versiones de .NET y se ejecutan en diferentes plataformas (x86 vs x86_64). Las imprecisiones de las operaciones de punto flotante no importan.Punto flotante determinista y .NET
En Java usaría strictfp. En C/C++ y otros lenguajes de bajo nivel, este problema se resuelve esencialmente accediendo a los registros de control de FPU/SSE, pero eso probablemente no sea posible en .NET.
Incluso con el control del registro de control FPU, el JIT de .NET generará código diferente en diferentes plataformas. Algo así como HotSpot sería aún peor en este caso ...
¿Por qué lo necesito? Estoy pensando en escribir un juego de estrategia en tiempo real (RTS) que depende en gran medida de la matemática de coma flotante rápida junto con una simulación de bloqueo por pasos. Esencialmente, solo transmitiré la entrada del usuario a través de la red. Esto también se aplica a otros juegos que implementan repeticiones almacenando la entrada del usuario.
No es una opción son:
- decimales (demasiado lento)
- valores de punto fijo (demasiado lentos y engorrosos cuando se utiliza sqrt, sin, cos, tan, atan ...)
- actualización estado en la red como un FPS: enviar información de posición para cientos o miles de unidades no es una opción
¿Alguna idea?
Si escribo la parte crítica (simulación) del juego en C/C++, entonces puedo simplemente escribir todo el juego sin .Net. Quizás esa sea la manera "correcta" aquí. – user285934
Mire la funcionalidad C/C++ IJW (It-Just-Works) del compilador MSVC. Te permitirá escribir lo que necesitas para escribir como código no administrado, y hacer el resto como código administrado para interactuar sin problemas con el resto de las partes administradas de tu juego. – Ants