Mentre tutti i tipi interi in Rust implementano Ord
che enfatizza l'ordine totale, i tipi a virgola mobile implementano solo PartialOrd
. Ciò significa che potrebbero esistere valori in virgola mobile che non possono essere confrontati. Questo sembra difficile da digerire dato che i numeri in virgola mobile possono essere pensati come approssimazioni a numeri reali che risultano essere un insieme totalmente ordinato. Anche l'aggiunta di infinito positivo e negativo mantiene l'insieme di numeri reali totalmente ordinati. Perché questa strana scelta in Rust?Perché Rust non implementa l'ordinamento totale tramite il tratto Ord per f64 e f32?
Questa restrizione indica che un algoritmo di ordinamento/ricerca generico può solo assumere ordini parziali sui numeri. Lo standard IEEE 754 sembra fornire uno total ordering predicate.
I NaN sono così tanto un problema nel codice generico?
Non sapevo che il predicato ordine totale non è implementato nell'hardware. –
@ShaileshKumar È possibile ottenere un predicato di ordine totale (non so se è esattamente lo stesso di IEEE 754) confrontando prima i segni dei valori (- <+) e quindi, se i valori sono del stesso segno, confrontando gli altri bit con un'istruzione di confronto dei numeri interi sui bit della rappresentazione. –