Pensando en programar

¿Por qué pasan cosas raras con los números al hacer operaciones matemáticas?

Pregunta: La pregunta viene de r/javascript en reddit y es una bastante recurrente: ¿Por qué pasan cosas raras con los números al intentar hacer operaciones matemáticas?

No relacionado con JavaScript

La respuesta es, en realidad, bastante simple y no está en su mayor parte relacionada con JavaScript.

El asunto es que en JavaScript solo existe un tipo de números y ese es el estándar IEEE-754 para aritmética en coma flotante. Y así, una vez que estás obligado a hacer operaciones aritméticas en binario en coma flotante, entonces aparecen una serie de limitaciones. Estas ya han sido descritas adecuadamente en otros sitios, así que no hace falta que yo lo haga aquí. Excelente enlace adicional

Podríamos preguntarnos por qué sólo tenemos un tipo de números y por qué ese, pero creo que, una vez más, deriva del simple intento de simplificar el lenguaje, tanto para usuarios como para implementadores.

NaN

Nótese que esto también responde a por qué NaN != NaN, ya que el estándar también define el comportamiento de NaN y sus comparaciones. Al menos en este respecto.

La razón subyacente de por qué NaN != NaN es simplemente la lógica: Que X no sea una cosa y que Y tampoco sea esa cosa no nos puede decir nada sobre si X e Y son iguales o diferentes. Podríamos hacer que NaN == NaN lance algún tipo de excepción o que devuelva undefined, pero:

  1. dejar que una simple comparación lance una excepción parece una solución difícilmente práctica en cualquier situación
  2. dejar que una comparación devuelva cualquier cosa que no sea true o false complicaría de manera bastante ridícula la lógica booleana
  3. undefined, en un contexto booleano, va a ser evaluado como false. Y devolver false es también menos arriesgado que devolver true.