Benutzer-Werkzeuge

Webseiten-Werkzeuge


einstieg:weiteredatentypen:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


einstieg:weiteredatentypen:start [2024/08/31 12:03] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== Die Datentypen float, double ======
 +Wir haben bisher nur den Datentyp ''int'' zum Speichern von ganzzahligen Werten kennengelernt. Es wird Zeit, dass wir auch andersartige Daten speichern können! 
 +===== float =====
 +<WRAP center round info 60%>
 +Variablen vom Datentyp ''float'' können rationale Zahlen (ggf. näherungsweise!) speichern. Die Bezeichnung dieses Datentyps ist eine Kurzform für "floating point number", auf Deutsch "Fließkommazahl" oder "Gleitkommazahl".
 +</WRAP>
  
 +Falls es Dich genauer interessiert, in welcher Form diese Zahlen gespeichert werden, findest Du in [[https://de.wikipedia.org/wiki/Gleitkommazahl|Wikipedia eine gute Darstellung]]. Schön anschaulich ist auch [[https://www.youtube.com/watch?v=gc1Nl3mmCuY|dieses Video]]. \\ \\ 
 +Führe das folgende Beispielprogramm in Einzelschritten aus und schau' Dir dabei den Inhalt des Reiters "Variablen" auf der rechten Seite an!
 +<HTML>
 +
 +<div class="java-online" style="height: 200px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen1'}">
 +
 +<script type="text/plain" title="Test1.java">
 +float radius = 1.5;
 +float umfang = 2 * 3.14159 * radius;
 +float flaecheninhalt = 3.14159 * radius * radius;
 +
 +println("Ein Kreis mit Radius " + radius + " hat den Umfang " + umfang + " und den Flächeninhalt " + flaecheninhalt);
 +</script>
 +
 +</div>
 +
 +</HTML>
 + \\ 
 +<WRAP center round tip 60%>
 +''float''-Werte in **Java** entsprechen Dezimalzahlen mit ungefähr 7 gültigen Ziffern und verbrauchen jeweils 4 Byte Speicherplatz. Da es nur endlich viele ($2^{32}$) verschiedene ''float''-Werte gibt, decken sie nur einen kleinen Teil aller (unendlich vielen!) rationalen Zahlen ab, und auch diesen nicht gleichmäßig: Die durch ''float''-Werte exakt darstellbaren Zahlen liegen um die Zahl 0 herum am dichtesten. Ihre Dichte nimmt sowohl in positiver als auch in negativer Richtung von 0 an immer weiter ab, siehe [[https://upload.wikimedia.org/wikipedia/commons/8/8f/Exakt_darstellbare_Gleitkommazahlen.png|hier]]. \\ \\ 
 +**Besonderheit von LearnJ:**
 +Die Programmiersprache auf dieser Website speichert''float''-Werte intern als ''double''-Werte (siehe unten), rechnet also immer mit doppelter Genauigkeit (ca. 14 gültige Ziffern). Die Ursache dafür liegt im Browser, mit dem Du diese Website betrachtest. Er kennt nur einen einzigen Datentyp für Zahlen, der von der Genauigkeit her den ''double''-Werten in Java entspricht.
 +</WRAP>
 +
 +==== Ganzzahldivision/Gleitkommazahldivision ====
 +**Rätsel:** \\  Welche Zahl gibt das folgende Programm aus? Warum?
 +<HTML>
 +
 +<div class="java-online" style="height: 120px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen3'}">
 +
 +<script type="text/plain" title="Test1.java">
 +
 +int a = 12;
 +int b = 6;
 +float c = b/a * 100;
 +println(c);
 +
 +</script>
 +
 +</div>
 +
 +</HTML>
 + \\ \\ 
 +
 +Je nach Datentyp der Operatoren wirkt der Operator ''/'' ("geteilt durch") unterschiedlich. Am folgenden Beispiel kannst Du das deutlich sehen:
 +<HTML>
 +
 +<div class="java-online" style="height: 80px; width: 50%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen2'}">
 +
 +<script type="text/plain" title="Test1.java">
 +
 +println(5/3);
 +println(5.0/3);
 +
 +</script>
 +
 +</div>
 +
 +</HTML>
 + \\ \\ 
 +=== Erklärung: ===
 +Da beide Operanden der Division in Zeile 1 ganzzahlige Werte sind, wird die Division als Ganzzahldivision ausgeführt, entsprechend ist $5 : 3 = 1$. In Zeile 2 wird der Compiler durch die Schreibweise ''5.0'' gezwungen, den 1. Operanden als Gleitkommazahl zu speichern, entsprechend wandelt er auch den 2. Operanden in eine Gleitkommazahl um, bevor er die Division als Gleitkommadivision ausführt.
 +
 +
 +
 +
 +
 +===== double =====
 +<WRAP center round info 60%>
 +Variablen vom Datentyp ''double'' können - ähnlich wie ''float''-Variablen - rationale Zahlen (näherungsweise) speichern, verwenden dazu jeweils doppelt so viel Speicherplatz (64 Bit je Wert) und sind daher **doppelt genau**. -> Daher auch der Name ;-). \\ \\ 
 +Ein ''double''-Wert besitzt ca. 14 gültige Ziffern.
 +</WRAP>
 +
 +**Einfaches Beispiel:** \\ 
 +Ein Kapital von 1000 € wird jährlich mit 3 % verzinst. Wie viel Geld ist nach 0, 1, 2, ... Jahren auf dem Konto?
 +<HTML>
 +
 +<div class="java-online" style="height: 180px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen4'}">
 +
 +<script type="text/plain" title="Test1.java">
 +double kapital = 1000;
 +double zinssatzInProzent = 3;
 +
 +for(int i = 0; i < 6; i++){
 +   println("Kapital nach " + i + " Jahren: " + kapital);
 +   kapital = kapital + kapital * zinssatzInProzent/100;
 +}
 +</script>
 +
 +</div>
 +
 +</HTML>
 + \\ \\ 
 +==== Die Klasse Math ====
 +Zum Rechnen mit ''double''-Werten gibt es nicht nur die Operatoren ''+'', ''-'', ''*'' und ''/'', sondern auch viele Funktionen wie $sin$, $cos$, $sqrt$ usw. . Diese Funktionen findest Du als statische Methoden (dazu später mehr...) in der Klasse ''Math''. Ihre Benutzung ist sehr einfach:
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 140px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen5'}">
 +
 +<script type="text/plain" title="Test1.java">
 +println("Die Quadratwurzel von 2 ist: " + Math.sqrt(2));
 +println("Der Sinus von Pi/4 ist: " + Math.sin(Math.PI/4));
 +println("Das Vorzeichen von -27 ist: " + Math.signum(-27));
 +println("Der Betrag von -12 ist: " + Math.abs(-12));
 +println("Zufällige Zahl aus [0;1[ : " + Math.random()); 
 + 
 +</script>
 +
 +</div>
 +
 +</HTML>
 + \\ \\ 
 +<WRAP center round tip 60%>
 +Die Klasse ''Math'' besitzt noch viel mehr nützliche Methoden. Tippe ins Programm oben in Zeile 5 einfach mal ''Math.'' ein und sieh' Dir an, welche Methoden Dir der Editor vorschlägt!
 +</WRAP>
 +
 +===== Runden von Zahlen =====
 +Kann man im Programm aus einem ''double'' oder ''float''-Wert einen ganzzahligen ''int''-Wert machen? -> Klar, aber man muss dem Computer sagen, wie er dabei runden soll:
 +<HTML>
 +
 +<div class="java-online" style="height: 340px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen6'}">
 +
 +<script type="text/plain" title="Test1.java">
 +double zahl1 = 82.6;
 +double zahl2 = 3.4;
 +
 +println("Zahl1: " + zahl1 + ", Zahl 2: " + zahl2);
 +
 +println("Gerundet:");
 +println(Math.round(zahl1) + "; " + Math.round(zahl2));
 +
 +println("Aufgerundet:");
 +println(Math.ceil(zahl1) + "; " + Math.ceil(zahl2));
 +
 +println("Aubgerundet:");
 +println(Math.floor(zahl1) + "; " + Math.floor(zahl2));
 +
 +</script>
 +
 +</div>
 +
 +</HTML>
 + \\ \\ 
 +
 +==== Runden auf eine vorgegebene Zahl von Nachkommastellen ====
 +Wie kann man eine Zahl beispielsweise auf 3 Nachkommastellen runden? Löse das Problem mit Hilfe der oben angegebenen Funktionen!
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 340px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen6'}">
 +
 +<script type="text/plain" title="Test1.java">
 +double zahl = 82.632876;
 +
 +println("Zahl: " + zahl);
 +
 +println("Gerundet auf 3 Nachkommastellen:");
 +
 +// Ergänze die folgende Zeile durch einen geeigneten Term,
 +// der für jeden beliebigen Wert in der Variable zahl das
 +// richtige Ergebnis liefert!
 +double zahlGerundet = 
 +println(zahlGerundet);
 +
 +
 +</script>
 +
 +</div>
 +
 +</HTML>
 + \\ \\ 
 +[[.loesungRunden:start|Lösung]]
 +
 +
 +
 +===== Zufallszahlen =====
 +Die Methode Math.random() ermittelt bei jedem Aufruf eine neue Zufallszahl im Intervall $[0 \ldots 1[$:
 +<HTML>
 +
 +<div class="java-online" style="height: 140px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen7'}">
 +
 +<script type="text/plain" title="Test1.java">
 +for(int i = 1; i <= 5; i++){
 +   println(i + ". Zahl: " + Math.random());
 +}
 +
 +</script>
 +
 +</div>
 +
 +</HTML>
 + \\ \\ 
 +==== Ganzzahlige Zufallszahl aus der Menge $\{0; 1; 2; \ldots 98; 99\}$ ====
 +Ganzzahlige Zufallszahlen aus der Menge $\{a, a+1, \ldots b-1, b\} (mit\ a, b\in \mathbb{N})$ erhält man mit der Methode ''Random.randint(a, b)''.
 +<HTML>
 +
 +<div class="java-online" style="height: 140px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen8'}">
 +
 +<script type="text/plain" title="Test1.java">
 +int zahl = Random.randint(0, 99);
 +println("Zufallszahl: " + zahl);</script>
 +
 +</div>
 +
 +</HTML>
 +<WRAP center round tip 80%>
 +Viele Programmiersprachen bieten nur eine Methode wie ''Math.random()'', die Zufallszahlen aus dem Intervall $[0,1[$ zurückliefert. Wie man mit ihrer Hilfe ganze Zufallszahlen aus einer Menge $\{a, a+1, \ldots b-1, b\} (mit\ a, b\in \mathbb{N})$ berechnet, [[.zufallszahlloesung:start|erkläre ich Dir hier an einer Beispielaufgabe.]]
 +</WRAP>
 + 
 +==== Rationale Zufallszahl aus der Menge $[a, b[$ ====
 +... erhältst Du mit der Methode ''Random.randdouble(a, b)''.
 +
 +==== Aufgabe 1: ====
 +Schreibe ein Programm, das eine ganzzahlige Zufallszahl aus der Menge $\{5; 6; 7; \ldots 11; 12\}$ ausgibt, indem es die Methode ''Math.random()'' verwendet und daraus geeignete Zufallszahlen berechnet! \\ \\ 
 +**[[.zufallszahlloesung:start|Lösung mit ausführlicher Erklärung]]**
 +
 +==== Aufgabe 2: ====
 +Schreibe ein Programm, das den Benutzer auffordert, eine Zahl einzugeben und **ohne Benutzung der Klasse Math** die Wurzel dieser Zahl berechnet und ausgibt.
 +
 +<HTML>
 +
 +<div class="java-online" style="height: 440px; width: 100%" data-java-online="{'withBottomPanel': false, 'id': 'datentypen9'}">
 +
 +<script type="text/plain" title="Test1.java">
 +
 +</script>
 +
 +</div>
 +
 +</HTML>
 + \\ \\ 
 +== Tipp: ==
 +Verwende beispielsweise das [[https://de.wikipedia.org/wiki/Heron-Verfahren#Geometrische_Veranschaulichung_des_Heron-Verfahrens|Heron-Verfahren]] ([[https://www.youtube.com/watch?v=-wEJzyHB5us|hier ein Video]]) oder [[https://www.youtube.com/watch?v=Pcnb-IkkrXM|Intervallschachtelung]].
 + \\ \\ 
 +[[.loesungaufgabe2:start|Hier geht's zur Lösung.]]