Irgendwann in der Entwicklung der Computertechnologie wurde klar, dass Zentraleinheiten Hardwaregeräte zur Verarbeitung von Gleitkommazahlen benötigten. Heutzutage können alle Computerarchitekturen effektiv mit solchen Zahlen arbeiten. Natürlich kann man auch in Programmiersprachen nicht auf die entsprechenden Datentypen verzichten. In Java gibt es zwei Gleitkomma-Datentypen: Float und Double. Das Java- Schlüsselwort Float definiert eine reelle Zahl, die 32 Bit im Speicher belegt. Über solche Zahlen werden wir in diesem Artikel sprechen.
Das Schlüsselwort Float bedeutet also eine Zahl, einen Wert mit einfacher Genauigkeit, der 32 Bit oder 4 Byte im Speicher benötigt. Auf einigen Prozessoren ist die Arbeit mit solchen Zahlen schneller und sie beanspruchen, wie bereits erwähnt, weniger Platz im Vergleich zu Zahlen mit doppelter Genauigkeit. Es ist jedoch unmöglich, eine eindeutige Aussage über die Geschwindigkeit zu treffen. Nehmen wir an, dass einige moderne Prozessoren Zahlen mit genau doppelter Genauigkeit schneller verarbeiten.
Gleitkommazahlen. Wie werden reelle Zahlen in einem Computer gespeichert?
Um reelle Zahlen im Computerspeicher zu speichern, wird eine bestimmte Anzahl von Bits zugewiesen. Eine reelle Zahl wird als Vorzeichen (Plus oder Minus), Mantis und Exponent gespeichert. Was Mantisse und Exponent sind, lässt sich am besten anhand eines Beispiels erklären. Die ungefähre Masse des Mondes beträgt 7* 1022. Hier ist 7 die Gottesanbeterin, bei 22 der Exponent. Wenn Sie große oder umgekehrt sehr kleine Zahlen auf dem Bildschirm anzeigen, können Sie einen Eintrag wie 7E22 sehen. Dies ist die Gleitkommazahl, und 7 ist hier die Gottesanbeterin und 22 ist der Exponent oder die Potenz von 10. Diese Notation wird Exponentialnotation genannt.Java-Float-Schlüsselwort und Java-Doppelschlüsselwort
Float-Werte (Gleitkommazahlen oder reelle Zahlen) werden in Java durch die Typen float und double dargestellt . Mit diesen Schlüsselwörtern werden Werte bis zu einem bestimmten Nachkommazeichen gespeichert. Double sind Zahlen mit doppelter Genauigkeit, die den angegebenen oder durch Berechnungen erhaltenen Werten möglichst nahe kommen. Java Double wird für alle mathematischen Berechnungen (Quadratwurzel, Sinus, Cosinus, ..) sowie für alle Berechnungen verwendet, bei denen es auf eine gewisse Genauigkeit ankommt. Der Datentyp float wird für einen weniger präzisen Gleitkommatyp verwendet. Es wird sehr selten verwendet, um Speicherplatz zu sparen. Nachfolgend finden Sie eine Tabelle mit den wichtigsten Informationen zu Float und Double sowie deren Unterschieden.Schweben | Doppelt | |
---|---|---|
Hauptsächlich | Float ist ein Wert mit einfacher Genauigkeit | Es handelt sich um einen Wert mit doppelter Genauigkeit |
Standard Größe | 4 Byte (32 Bit) | 8 Byte (64 Bit) |
Standardwert | 0,0f | 0,0 |
Reichweite | von 1.4e–045 bis 3.4e+038 | von 4,9e–324 bis 1,8e+308 |
Wofür wird es verwendet? | Um Speicher zu sparen | relativ genau mit Bruchzahlen arbeiten |
Java Float und Double Deklaration
Sie können eine Zahl vom Typ double auf die gleiche Weise deklarieren wie Zahlen anderer Typen:double myDouble = 2.7;
Wenn Sie jedoch eine Gleitkommazahl auf diese Weise darstellen, fordert der Compiler Sie auf, den Typ der Zahl in „Double“ zu ändern. Hier ist ein falsches Beispiel einer Float -Variablen:
public class FloatExample {
public static void main(String[] args) {
//double and float variables
double myDouble = 2.7;
float myFloat = 3.14;
}
}
Folgendes passiert, wenn Sie dieses Programm ausführen:
Error:(4, 25) java: incompatible types: possible lossy conversion from double to float
Tatsache ist, dass die Verwendung von Gleitkommazahlen unerwünscht ist und nur aus Gründen der Speicherersparnis erfolgen sollte. Alle reellen Bruchzahlen in Java sind standardmäßig Double , und die Syntax der Sprache betont dies ebenfalls. Wenn Sie wirklich mit dem Float-Typ arbeiten möchten, müssen Sie ihn explizit mit einem f am Ende der Zahl angeben.
public class FloatExample {
public static void main(String[] args) {
//double and float variables
double myDouble = 2.7;
float myFloat = 3.14f;
}
}
Float- und Double-Zahlen können übrigens in Exponentialform geschrieben werden.
float myFloat2 = 2E22f;
double myDouble2 = 3e10;
Wenn Sie ausreichend große Zahlen in ihrer „normalen“ Darstellung verwenden, zeigt Java diese sofort in Exponentialform an. Nehmen wir ein Beispiel:
public class FloatExample {
public static void main(String[] args) {
//float variables
float myFloatNumber1=2182818284590.45f;
float myFloatNumber2=19822612787260.141592181f;
System.out.println("myFloatNumber1 = " + myFloatNumber1);
System.out.println("myFloatNumber2 = " + myFloatNumber2);
System.out.println("myFloatNumber1 + myFloatNumber2 = " + myFloatNumber1 + myFloatNumber2);
}
}
Das Ergebnis dieser Programmarbeit ist hier:
myFloatNumber1 = 2.1828183E12 myFloatNumber2 = 1.98226121E13 myFloatNumber1 + myFloatNumber2 = 2.1828183E121.98226121E13
Beispiel für spezielle Float- und Double-Zahlen
In der Java-Sprache gibt es drei spezielle Gleitkommazahlen, die zur Anzeige von Überläufen und Fehlern verwendet werden. Hier sind sie:-
Positive Unendlichkeit ist das Ergebnis der Division einer positiven Zahl durch 0. Dargestellt durch die Konstanten Double.POSITIVE_INFINITY und Float.POSITIVE_INFINITY .
-
Negative Unendlichkeit ist das Ergebnis der Division einer negativen Zahl durch 0. Dargestellt durch die Konstanten Double.NEGATIVE_INFINITY und Float.NEGATIVE_INFINITY .
-
NaN (keine Zahl) steht für die Berechnung von 0/0 oder das Ziehen der Quadratwurzel einer negativen Zahl. Dargestellt durch die Konstanten Double.NaN und Float.NAN .
public class FloatExample {
public static void main(String[] args) {
int myInt = 1;
float zero = 0.0f;
double negZero = -0.0;
double negativeInfinity = Double.NEGATIVE_INFINITY;
double positiveInfinity = Float.POSITIVE_INFINITY;
System.out.println(myInt / zero);
System.out.println(myInt / negZero);
System.out.println(zero == negZero);
System.out.println(negativeInfinity * 0);
System.out.println(positiveInfinity+negativeInfinity);
}
}
Das Ergebnis ist:
Unendlichkeit - Unendlichkeit wahr NaN NaN
Ist doppelte Präzision ausreichend?
Tatsächlich ist die Verwendung von Gleitkommazahlen beispielsweise in Finanzberechnungen trotz der doppelten Genauigkeit des Double- Typs nicht die beste Idee, da Rundungsfehler nicht akzeptabel sind. Versuchen Sie also, die Ausgabe des folgenden Programms auf dem Bildschirm anzuzeigen.public class FloatExample {
public static void main(String[] args) {
System.out. println( "2.0 - 1.1 = " + (2.0 - 1.1));
}
}
Sie erhalten folgendes Ergebnis:
2,0 - 1,1 = 0,8999999999999999
Es wäre logisch anzunehmen, dass das Ergebnis 0,9 sein wird. Solche Fehler kommen jedoch recht häufig vor und hängen mit der internen binären Darstellung von Zahlen zusammen. Wir können beispielsweise den genauen Wert von ⅓ nicht als Dezimalbruch darstellen; Natürlich gibt es ähnliche Einschränkungen im Binärsystem. Wenn die Aufgabe die Beseitigung von Rundungsfehlern erfordert, verfügt Java hierfür über die Klasse BigDecimal .
GO TO FULL VERSION