Was ist der Grund für alle Vergleiche false zurückgeben, für IEEE754 NaN-Werte?

Warum Vergleiche von NaN-Werte Verhalten sich anders als alle anderen Werte?
Das heißt, alle Vergleiche mit den Operatoren ==, <=, >=, <, > wo einer oder beide Werte NaN false zurückgibt, im Gegensatz zu dem Verhalten aller anderen Werte.

Ich nehme an, dies vereinfacht die numerischen Berechnungen in gewisser Weise, aber ich konnte nicht finden eine explizit angegebene Grund, das nicht auch in der Vorlesung Notizen auf den Status von IEEE 754 von Kahan, der diskutiert, andere design-Entscheidungen im detail.

Dieses abweichende Verhalten verursacht Probleme, wenn dabei die einfache Verarbeitung der Daten. Zum Beispiel beim Sortieren einer Liste mit Datensätzen, die w.r.t. einige real-valued-Feld in ein C-Programm muss ich zusätzlichen code schreiben zu behandeln NaN als maximales element, da sonst die sort-Algorithmus könnte verwirrt werden.

Edit:
Die Antworten, die bisher alle argumentieren, dass es sinnlos ist zu vergleichen NaNs.

Ich Zustimmen, aber das bedeutet nicht, dass die Antwort richtig ist, ist falsch,
eher würde es sich um einen Nicht-Boolean (NaB), die glücklicherweise aber nicht vorhanden ist.

So dass die Wahl der Rückgabe von true oder false für Vergleiche ist in meinen Augen willkürlich,
und für Allgemeine Datenverarbeitung wäre es von Vorteil, wenn es gehorchte den gewöhnlichen Gesetzen
(Reflexivität von ==, Dreiteilung der <, ==, >),
damit Datenstrukturen, die darauf angewiesen sind, diese Gesetze zu verwechseln.

Daher bitte ich um einige konkrete Vorteil, diese Gesetze zu brechen, nicht nur philosophische Argumentation.

Edit 2:
Ich glaube, ich verstehe jetzt warum NaN maximale wäre eine schlechte Idee, es würde mess up die Berechnung der oberen Grenzen.

NaN != NaN könnte wünschenswert sein, um zu vermeiden, erkennen von Konvergenz in einer Schleife wie

while (x != oldX) {
    oldX = x;
    x = better_approximation(x);
}

was allerdings sollte besser geschrieben werden, durch vergleichen der absoluten Differenz mit einem kleinen limit.
Also IMHO ist dies ein relativ schwaches argument für das brechen der Reflexivität in NaN.

Einmal ein NaN ist in die Berechnung, es wird in der Regel nie verlassen, so Ihr Konvergenz-test würde zu einer Endlosschleife. Es ist in der Regel vorzuziehen, um den Fehler zu melden, zu konvergieren, um das aufrufen der routine, evtl. durch Rücksendung NaN. So, die loop-Struktur würde in der Regel zu so etwas wie while (fabs(x - oldX) > threshold), verlassen Sie die Schleife, wenn Konvergenz Eintritt oder ein NaN tritt in die Berechnung. Nachweis von NaN-und entsprechende Abhilfe würde dann geschehen außerhalb der Schleife.
Wenn NaN wurden die minimales element von der Ordnung, die while-Schleife würde immer noch funktionieren.
Food for thought: grouper.ieee.org/groups/1788/email/pdfmPSi1DgZZf.pdf - Seite 10

InformationsquelleAutor starblue | 2009-10-14

Schreibe einen Kommentar