Estoy buscando hacer un juego en red determinista y en todas partes en línea hay historias sobre cómo las matemáticas de punto flotante no son deterministas y, a menudo, darán resultados diferentes en diferentes computadoras, arquitecturas, procesadores, navegadores, etc.
Una de las razones de esto es que algunos procesadores pueden hacer operaciones matemáticas con una precisión de 80 bits (¿x87, creo?) y luego truncar a 64 bits para obtener el resultado final.
Luego, si lee estas publicaciones, la gente siempre menciona hacer todas las matemáticas con números enteros, usar bibliotecas matemáticas de punto fijo muy lentas o reescribir bibliotecas matemáticas completas para que sean deterministas.
Pero, estoy confundido. Para todas las matemáticas en mi juego, realmente no me importa si mi coma flotante tiene 5 decimales de precisión frente a 15. Entonces, ¿por qué la solución a este problema no es simplemente redondear?
Es decir, cada vez que realice una operación en puntos flotantes, aplique esta función al resultado:
function round(n) { return Math.truncate(n * 100000) / 100000; }Realmente no me importa que esto haga que mis flotadores sean menos precisos. Realmente no necesito niveles de precisión dementes de todos modos. Pero, ¿no soluciona esto el problema del determinismo de coma flotante? Porque si bien los diferentes procesadores pueden tener resultados ligeramente diferentes en las funciones matemáticas, ninguno de ellos estará tan lejos, ¿no? Entonces, si simplemente redondeamos el resultado a 6 decimales con la función anterior, ¿no deberían todas las arquitecturas dar los mismos resultados?
Y luego no tiene que reescribir toda su biblioteca matemática o usar operadores de punto fijo extremadamente lentos en todas partes. Marcando esto como Javascript porque realmente solo me importa lo relacionado con Javascript personalmente, aunque es un poco agnóstico del lenguaje.