Negative kleine Zahlen in Clojure

8

Während meiner clojure studies fand ich folgendes:

%Vor%

Ist das ein Fehler?

Dann habe ich versucht:

%Vor%

Hier habe ich festgestellt, dass eine Zahl als -0.0 gilt:

%Vor%

Auf diese Weise kann ich wissen, ob eine Zahl negativ ist, selbst wenn sie lächerlich nahe bei Null liegt.

All dies, weil ich versucht habe, dieses Problem zu lösen:

%Vor%

Da es für die Rektaszension (das himmlische Äquivalent der irdischen Länge) keinen negativen Wert gibt, habe ich getestet, ob die Nachbedingung so funktioniert, dass garantiert, dass die Funktion keinen negativen Wert für die RA zurückgibt, egal was passiert Nummern übergebe ich an die Funktion ..

    
Bruno Alessi 18.09.2012, 11:26
quelle

2 Antworten

8

Ich vermute, dass die (= 0 -1E-400) die Methode Double.equals() von java unter der Haube verwendet, die die positiven und negativen Nullen als ungleich behandelt. Dieses Verhalten ist eine Verletzung des IEEE-Gleitkomma-Standards. Die anderen Vergleichsoperatoren übersetzen andere Verfahren, die sich gemäß dem Standard verhalten, d. H. Behandeln +0,0 und -0,0 als gleich.

Um das standardkonforme Verhalten zu erhalten, verwenden Sie den Zahlenäquivalenzoperator == . Daher wird (== 0 -0.0) zu true ausgewertet.

Mehr über signierte und unsignierte Null auf Wikipedia: Ссылка

Allgemein gesagt: Der Vergleich von Gleitkommazahlen für die Gleichheit sollte immer den Verdacht wecken.

    
Rafał Dowgird 18.09.2012, 12:06
quelle
2

Beachten Sie, dass das Verhalten von Double einen Leistungskompromiss zwischen Prozessorzeit und -genauigkeit bedeutet. Clojure erleichtert die Arbeit mit BigDecimals, die rechenintensiver sind, aber bessere Genauigkeitsgarantien bieten. Sie können numerische BigDecimal-Literale angeben, indem Sie nach der Literalnummer 'M' anhängen, und alle numerischen Operatoren akzeptieren BigDecimals. Schnelles Testfahren für Ihr Beispiel:

%Vor%     
animal 18.09.2012 15:42
quelle

Tags und Links