2012-04-10 8 views

Antwort

8

Ja und nein. Ja, denn in einem abstrakten Sinn ist die Unendlichkeit die Unendlichkeit (und, wie ich unten erläutere, werden für die meisten Code-Floats ohnehin in Doubles konvertiert).

Nein, jedoch, weil auf der Bit-Ebene die beiden Unendlichkeiten unterschiedlich sind. Ein Double ist 64 Bit in Java und ein Float ist 32 Bit in Java, so trivial sind sie auf der Darstellungsebene unterschiedlich.

In Java werden Fließkommazahlen (floats und doubles) mit dem Gleitkommaformat IEEE 754 dargestellt. Dies ist der Standard, den heutzutage fast jeder verwendet. Jede Zahl wird als Vorzeichenbit in Binärform dargestellt, zuzüglich einer bestimmten Anzahl von Exponentenbits plus einer bestimmten Anzahl von Mantissenbits (Signifikanden). In einem Float oder einem Double wird positive Unendlichkeit mit einem Vorzeichenbit von 0, Exponentenbits alle 1 und Mantissenbits alle 0 dargestellt. Negative Unendlichkeit wird auf die gleiche Weise dargestellt, außer dass das Vorzeichenbit 1 ist zwei sehr ähnliche Wege, aber wegen der unterschiedlichen Anzahl von Exponenten und Mantissen-Bits zwischen Floats und Doubles sind die Bit-Level-Muster unterschiedlich.

Zum Schreiben von Code können Sie sie als gleich behandeln. Wann immer Sie doubles und floats zusammen benutzen, außer Sie sagen explizit anders, wird der float automatisch in ein double umgewandelt und der Ausdruck wird zu einem double führen, so dass sich eine Float Unendlichkeit für die meisten praktischen Zwecke wie eine doppelte Unendlichkeit verhält.

+0

ich sehe. Und die 'Double.compare (double, double)' Methode wäre schlau (oder vielleicht dumm?) Genug, um 0 für 'Double.compare (Float.POSITIVE_INFINITY, Double.POSITIVE_INFINITY)' zurückzugeben? – user113454

+1

@ user1064918 Das hat nichts mit 'Double zu tun.vergleichen (doppelt, doppelt) '. Wie ich in meiner Antwort darauf anspreche, wo immer ein Double erwartet wird und ein Float geliefert wird, wird der Float automatisch auf ein Double gewandelt, so dass 'Double.compare (double, double)' nur zwei Doubles sieht. Die * JVM und die Hardware * sind intelligent genug, um 32-Bit-Unendlichkeit (Float) zu erkennen und diese in 64-Bit-Unendlichkeit (doppelt) umzuwandeln. –

+0

Das macht Sinn. Danke – user113454

1

Es hängt davon ab, was Sie mit "gleich" meinen. Die Bitmuster sind unterschiedlich, weil das Vorzeichen anders ist, aber sie sind immer noch beide unendlich.

Darüber hinaus erhalten die Regeln für die Werbung für Floats die unendliche Natur bei der Umwandlung in ein Doppel.

+0

Mit "gleich" meine ich, wenn Sie den Unterschied der beiden nehmen, erhalten Sie null. Ich habe nicht überprüft, was die Bitmuster für beide Fälle wären. Aber sollten sie nicht gleich sein, denn darauf setzt die Double.Compare (...) Methode an? – user113454

+3

@ user1064918 Nein, die Bitmuster sind nicht gleich, da Floats 32 Bit und Double 64 Bit sind. Außerdem, wenn Sie den Unterschied der beiden nehmen, erhalten Sie NaN, weil Infinity - Infinity auch keine Zahl in Mathe ist. –

+1

@ user1064918: In der Tat, 'Float.POSITIVE_INFINITY - Float.POSITIVE_INFINITY' ist auch' NaN', wie 'Float.POSITIVE_INFINITY + Float.NEGATIVE_INFINITY'. Die Subtraktion von zwei Unendlichkeiten ist einfach nicht definiert, unabhängig davon, welchen Datentyp Sie verwenden. – Amadan

1

In Java können Sie einen double mit einem float nicht direkt vergleichen. Wenn Sie dies versuchen, wird die float zuerst automatisch in eine double konvertiert. Dasselbe Problem tritt auf, wenn Sie eine float an eine Methode übergeben, die ein double Argument verwendet. Und wenn Sie Float.POSITIVE_INFINITY (zum Beispiel) in eine double konvertieren, erhalten Sie Double.POSITIVE_INFINITY.

So ist die Antwort auf Ihre Frage ist, dass Double.POSITIVE_INFINITY und Float.POSITIVE_INFINITY ist nicht ganz dasselbe, aber sie beide bezeichnen „eine Zahl, die zu groß zu vertreten ist“ und damit die Antwort, dass == geben Sie logisch konsistent sind.

1

Es gibt keine Möglichkeit, eine float mit double in Java als solche zu vergleichen. Alle Operationen sind Sie wahrscheinlich verwenden vergleichen double mit double nach implcitly Upcasting die float zu einem double

float f= 
double d = 
Double.compare(f, d); 
// equivelent to 
Double.compare((double) f, d);