sorting rust floating-point partial-ordering

sorting - ¿Por qué Rust no implementa la ordenación total a través del rasgo Ord para f64 y f32?



floating-point partial-ordering (1)

¿Cuál es tu pregunta, precisamente? ¿Pregunta si existe NaN o si puede obtenerse como resultado de cálculos accidentales o voluntarios? Sí, lo hace y puede. El tipo de estructura de datos que requiere un orden total para las claves se descompone completamente cuando el orden proporcionado no es un orden total. No desea que un valor excepcional sea diferente de sí mismo, ya que rompería los invariantes de la estructura y significaría que cualquier cosa puede suceder de aquí en adelante. NaN no es algo que deba asumirse como inocuo siempre que no se haya mostrado ningún problema, aunque se haya intentado en otros idiomas .

La definición de IEEE 754 de los operadores de comparación ordinarios < , <= , ... los hace muy útiles en general, si no cuando se necesita un pedido total. En particular, es fácil escribir las condiciones para que las entradas de NaN se envíen a la rama de error:

if (!(x <= MAX)) { // NaN makes this condition true error(); } if (!(x >= MIN)) { // NaN makes this condition true error(); }

Debido a que < y <= son tan útiles, son las operaciones implementadas como instrucciones sencillas y rápidas en los procesadores modernos; el predicado de orden total de IEEE 754 generalmente no se implementa en hardware. Los lenguajes de programación asignan las instrucciones rápidas a las construcciones en el lenguaje y dejan que cualquiera que excepcionalmente necesite TotalOrder lo elija de una biblioteca o incluso lo defina por sí mismo.

Si bien todos los tipos de enteros en Rust implementan Ord que enfatiza el ordenamiento total, los tipos de punto flotante solo implementan PartialOrd . Esto significa que podría haber valores de punto flotante que no se pueden comparar. Esto parece difícil de digerir, ya que los números de punto flotante se pueden considerar como aproximaciones a números reales que resultan ser un conjunto totalmente ordenado. Incluso la adición de infinito positivo y negativo mantiene el conjunto de números reales totalmente ordenado. ¿Por qué esta extraña elección en Rust?

Esta restricción significa que un algoritmo genérico de búsqueda / clasificación solo puede asumir un orden parcial en los números. El estándar IEEE 754 parece proporcionar un predicado de orden total .

¿Son tanto los problemas de NaN en el código genérico?