2014-10-21 10 views
18

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?

risposta

13

Qual è la tua domanda, precisamente? Stai chiedendo se esiste NaN o se può essere ottenuto come risultato di calcoli accidentali o volontari? Sì, lo fa e può. Il tipo di struttura dati che richiede un ordine totale per le chiavi si interrompe completamente quando l'ordine fornito non è un ordine totale. Non vuoi nemmeno che un solo valore eccezionale sia diverso da se stesso, perché potrebbe rompere gli invarianti della struttura e significare che qualsiasi cosa può accadere d'ora in poi. NaN non è qualcosa che dovrebbe essere ritenuto innocuo purché non sia stato mostrato alcun problema, sebbene that has been tried in other languages.

La definizione IEEE 754 degli operatori di confronto ordinari <, <=, ... li rende molto utili in generale, se non quando è necessario un ordine totale. In particolare, è facile scrivere condizioni affinché ingressi NaN saranno inviati al ramo errore:

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

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

Poiché < e <= sono così utile, sono le operazioni implementate come singole istruzioni veloci in processors- moderno il predicato totalOrder di IEEE 754 in genere non è implementato nell'hardware. I linguaggi di programmazione mappano le istruzioni rapide ai costrutti nella lingua e lasciano a chiunque abbia eccezionalmente bisogno di totalOrder di prelevarlo da una libreria o addirittura di definirlo da sé.

+0

Non sapevo che il predicato ordine totale non è implementato nell'hardware. –

+0

@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. –

Problemi correlati