Python version | Javascript version | Whitepaperaritmética de punto flotante Python vs Javascript dando respuestas muy diferentes. ¿Qué estoy haciendo mal?
Por lo tanto, estoy trabajando en un sitio web para calcular las clasificaciones de Glicko para juegos de dos jugadores. Implica una gran cantidad de aritmética de coma flotante (raíces cuadradas, exponentes, división, todas las cosas desagradables) y, por alguna razón, recibo una respuesta completamente diferente de la implementación de Python del algoritmo que traduje línea por línea. La versión de Python está dando básicamente la respuesta esperada para el ejemplo encontrado en el documento original que describe el algoritmo, pero la versión de Javascript está bastante desfasada.
¿He cometido un error de traducción o las matemáticas de punto flotante de Javascript son menos precisas?
Expected answer: [1464, 151.4]
Python answer: [1462, 155.5]
Javascript answer: [1470.8, 89.7]
Así que el cálculo de la calificación no es TAN malo, siendo 99.6% exacto, pero la varianza está desactivada en 2/3!
Editar: La gente ha señalado que el valor predeterminado de RD en la versión Pyglicko es 200. Este es un caso del implementador original que deja en código de prueba, creo, ya que el caso de prueba se realiza en una persona con un RD de 200, pero claramente se supone que el valor predeterminado es 350. Sin embargo, especifiqué 200 en mi caso de prueba en Javascript, por lo que ese no es el problema aquí.
Editar: Se modificó el algoritmo para usar map/reduce. La calificación es menos precisa, la varianza es más precisa, ambas sin motivo aparente. Comienza el wallbanging.
Esto es probable porque Python y JavaScript no manejan los números de punto flotante de la misma manera. ¿Sabes cómo funcionan los números flotantes?(y cuando no lo hacen) – Halcyon
No sé si esto tiene algún significado, pero rd tiene por defecto 200 en python y 350 en javascript. @Frits: ambos usan IEEE 754. –
Sí, entiendo cómo funcionan los números flotantes y que, por ejemplo, no pueden representar números decimales exactamente. @Daniel Baulig: RD tiene un valor predeterminado de 200 en Python, que es incorrecto, pero se usa para el caso de prueba. En el documento técnico, se especifica que el RD se establece en 350, pero el caso de prueba es en un reproductor con un RD de 200, así que establecí el valor por defecto adecuado en Javascript pero llamé a un nuevo jugador en el caso de prueba con un RD de 200 –