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 ..
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.
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%Tags und Links clojure