¿Por qué las comparaciones de los valores de NaN se comportan de manera diferente a todos los demás valores? Es decir, todas las comparaciones con los operadores ==, <=,> =, <,> donde uno o ambos valores es NaN devuelve falso, contrario al comportamiento de todos los demás valores.
Supongo que esto simplifica los cálculos numéricos de alguna manera, pero no pude encontrar una razón explícitamente expuesta, ni siquiera en las Lecture Notes on the Status of IEEE 754 de Kahan que discute otras decisiones de diseño en detalle.
Este comportamiento desviado está causando problemas al realizar un procesamiento de datos simple. Por ejemplo, al ordenar una lista de registros con algún campo de valor real en un programa en C, necesito escribir un código adicional para manejar NaN como elemento máximo, de lo contrario, el algoritmo de clasificación podría confundirse.
Editar: Las respuestas hasta ahora argumentan que no tiene sentido comparar NaNs.
Estoy de acuerdo, pero eso no significa que la respuesta correcta sea falsa, sino que sería un Not-a-Boolean (NaB), que afortunadamente no existe.
Por lo tanto, la elección de devolver verdadero o falso para las comparaciones es, en mi opinión, arbitraria, y para el procesamiento general de datos sería ventajoso si obedeciera las leyes habituales (reflexividad de ==, tricotomía de <, ==,>), no sea que las estructuras de datos que confían en estas leyes se confunden.
Entonces, pido una ventaja concreta de romper estas leyes, no solo el razonamiento filosófico.
Edición 2: Creo que ahora entiendo por qué hacer que NaN sea máximo sería una mala idea, dañaría el cálculo de los límites superiores.
NaN! = NaN podría ser deseable para evitar detectar la convergencia en un bucle como
while (x != oldX) {
oldX = x;
x = better_approximation(x);
}
que, sin embargo, debería escribirse mejor comparando la diferencia absoluta con un límite pequeño. En mi humilde opinión, este es un argumento relativamente débil para romper la reflexividad en NaN.
while (fabs(x - oldX) > threshold)
salir del bucle si se produce la convergencia o si un NaN ingresa al cálculo. La detección del NaN y el remedio apropiado se realizarían fuera del circuito.