Einige Anfängerfragen (Datentypen, Wertebereich)

JavaNoob01

Mitglied
Hallo zusammen,
ich bin neu in Sachen Programmierung und habe einige Aufgaben, die mir doch ziemliche Verständnisprobeleme bereiten.

Aufgabe 1:
Java:
        int s=0;
        float sf=0f;
        int n=100_000_000;
        for(int k=1; k<=n;k++) {
            s=s+1;
            sf=sf+1;
        }
        System.out.println("s = " + s); // s = 100000000
        System.out.println("sf = " + sf); // sf = 1.6777216E7

Was ich mir zu der Aufgabe bisher zusammenreimen konnte ist, dass es wohl was mit der Zusammensetzung des Datentyp FLOAT zutun hat (obviously...).
Dass die 100 000 000 in INT hineinpassen verstehe ich glaube ich, da ist ja der Wertebereich 2^32-Bit = 4.294.967.296:
4.294.967.296 / 2 = 2.147.483.647 (inkl.Null)

(Hab ich das so richtig verstanden?)

Ich habe auch eine grobe Ahnung davon, wie Kommazahlen aufgebaut sind. Dass also das 1. Bit für das Vorzeichen ist, 8 Bit für die Charakteristik und 23 Bit für die Mantisse (Bei der einfachen Genauigkeit).
Nur bekomme ich das alles nicht zusammen. :-(
Meine offensichtliche Vermutung ist, dass die 100 000 000 einfach nicht in FLOAT hineinpassen und daher das Bitmuster (?) an irgendeiner Stelle abgeschnitten wird und es daher zu der krummen Zahl für sf kommt... Könnte mir das vielleicht jemand für Doofe erklären?

Die zweite Aufgabe schlägt in eine ähnliche Kerbe:
(Die In.readInt() und Out.print() sind aus einer Bibliothek, die das Übungsbuch verwendet)

[CODE lang="java" title="Überlaufprüfung"]class A10 {
static final int maxInt = 2147483647;
static final int minInt = -2147483648;

public static void main(String[] arg) {
In.open("input.txt");
int a = In.readInt();
int b = In.readInt();
In.close();

// check if a + b gives an overflow or an underflow
Out.print(a + " + " + b + ": ");
if (a > 0 && b > 0 && a > maxInt - b) // if a + b > maxInt
Out.println("Overflow");
else if (a < 0 && b < 0 && a < minInt - b) // if a + b < minInt
Out.println("Underflow");
else
Out.println("Ok");
}
}
/*
Sample input:
2000000000 10000
2147483647 1
-2147483647 -2
*/
[/CODE]

Was das Ziel der Aufgabe ist versteh ich glaub ich schon, aber eben wieder nicht wie.
Z.B. im ersten If-Zweig a > maxInt - b:
Wieso kommt da
"2147483647 + 1: Overflow" Als Ergebnis? 2147483648 ist nicht mehr in Int aber es wurde doch nur geprüft, ob a > maxInt - b gilt?
Und das wären doch eig 2147483646 und damit in INT darstellbar??


Hoffe mir kann jemand weiterhelfen! Bin doch ziemlich verwirrt mitlerweile von dem Ganzen.
 

Jw456

Top Contributor
Float kann nur 7 Stellen bei 9999999 findet ein überlauf statt
9999999+1 = 1.0 E7

a > maxInt - b
da wird erst die rechte Seite berechnet 2147483647-1 = 2147483646
danach kommt der Vergleich 2147483647 > 2147483646 ergibt true
 
Zuletzt bearbeitet:

JavaNoob01

Mitglied
Float kann nur 6 Stellen bei 9999999 findet ein überlauf statt
9999999+1 = 1.0 E7

a > maxInt - b
da wird erst die rechte Seite berechnet 2147483647-1 = 2147483646
danach kommt der Vergleich 2147483647 > 2147483646 ergibt true
Sry wenn ich nochmal doof nachfrage, aber:

Zu Afg 1:
Wieso kann Float nur 7 Stellen?

Zu Afg 2:
Die Aussage versteh ich schon, aber nicht wieso es dann zu dem Überlauf kommt bzw. es einer ist. :(
Ich hätte jetzt gedacht, das wird so gemacht, wie es in dem Kommentar daneben steht also:
if a + b > maxInt: Überlauf.
Das funktioniert wohl aber nicht, weil der Überlauf ja schon vorher passiert nehme ich an, oder?
Nur macht die Auswertung halt keinen Sinn für mich.
2147483647 > 2147483646, logisch. Nur wie kann man daraus auf den Überlauf schließen?
 

mihe7

Top Contributor
Dass die 100 000 000 in INT hineinpassen verstehe ich glaube ich, da ist ja der Wertebereich 2^32-Bit
Ein int hat 32-Bit. Mit 32 Bit lassen sich 2^32 verschiedene Zahlen/Zustände darstellen. Ein int speichert eine ggf. vorzeichenbehaftete Ganzzahl im Zweierkomplement. Das erste Bit wird als Vorzeichen verwendet, bleiben für nicht-negative Zahlen 2^31 Bit mit einem Wertebereich von 0 bis 2^31-1. Für negative Zahlen stehen ebenfalls 2^31 Bit zur Verfügung - mit einem Wertebereich von -1 bis -2^31. Ergo: der Wertebereich eines int geht von -2^31 bis 2^31-1.

Wieso kommt da
"2147483647 + 1: Overflow" Als Ergebnis? 2147483648 ist nicht mehr in Int aber es wurde doch nur geprüft, ob a > maxInt - b gilt?
Naja, Du willst ja wissen, ob a+b > maxInt gilt. Das lässt sich so nicht schreiben, denn falls mathematisch a+b > maxInt gilt, würdest Du ja den Wertebereich von int verlassen, d. h. a+b überlaufen und somit wäre die Bedingung nie erfüllt. Also formt man die Ungleichung um, indem man auf beiden Seiten b subtrahiert und erhält a > maxInt - b.

Meine offensichtliche Vermutung ist, dass die 100 000 000 einfach nicht in FLOAT hineinpassen und daher das Bitmuster (?) an irgendeiner Stelle abgeschnitten wird und es daher zu der krummen Zahl für sf kommt... Könnte mir das vielleicht jemand für Doofe erklären?
100.000.000 ist von der Größe her für float kein Problem (die Zahl ist auch exakt mit einem float darstellbar).

Das Problem ist die Präzision. Die Mantisse hat 23 Bit, ein Bit wird Dir geschenkt, so dass Du 16777215 darstellen kannst, indem Du alle Bts der Mantisse setzt. Addierst Du jetzt eins wird der Exponent angepasst, die Mantisse auf 0 gesetzt. Dert Wert ist 16777216 - aber die Zahl hat nun eine andere Präzision. Die nächstgrößere darstellbare Zahl ist nicht 16777217 sondern 16777218. Du kannst also noch so oft 1 auf 16777216 addieren, der Wert bleibt bei 16777216. Würdest Du dagegen 2 addieren, würdest Du als nächste Zahl natürlich 16777218 erhalten.
 

Jw456

Top Contributor
Zu Afg 2:
Die Aussage versteh ich schon, aber nicht wieso es dann zu dem Überlauf kommt bzw. es einer ist. :(
Ich hätte jetzt gedacht, das wird so gemacht, wie es in dem Kommentar daneben steht also:
if a + b > maxInt: Überlauf.
Das funktioniert wohl aber nicht, weil der Überlauf ja schon vorher passiert nehme ich an, oder?
Nur macht die Auswertung halt keinen Sinn für mich.
2147483647 > 2147483646, logisch. Nur wie kann man daraus auf den Überlauf schließen?

a > maxInt - b
"maxInt" ist 2147483647 in "b" ist 1 ergebnis 2147483646
"a" ist 2147483647 vergilchen mit dem ergebnis ist es true
es gibt keinen überlauf.

du hast auf einen überlauf geschlossen nicht ich.
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Das Problem ist die Präzision. Die Mantisse hat 23 Bit, ein Bit wird Dir geschenkt, so dass Du 16777215 darstellen kannst, indem Du alle Bts der Mantisse setzt. Addierst Du jetzt eins wird der Exponent angepasst, die Mantisse auf 0 gesetzt. Dert Wert ist 16777216 - aber die Zahl hat nun eine andere Präzision. Die nächstgrößere darstellbare Zahl ist nicht 16777217 sondern 16777218. Du kannst also noch so oft 1 auf 16777216 addieren, der Wert bleibt bei 16777216. Würdest Du dagegen 2 addieren, würdest Du als nächste Zahl natürlich 16777218 erhalten.
teste es mal bei 9999999 geht er auf 1.0 E7
 
K

kneitzel

Gast
Einfach einmal zum genauen Verständnis:
float hat 32 Bit. Und die setzen sich zusammen aus:
1 Bit Vorzeichen
8 Bit Exponent
23 Mantisse

Dazu muss man die Darstellung einer Zahl mit Exponent und Mantisse verstehen. Das kann man erst einmal im Dezimalsystem durchspielen:

a * 10^b
Nun stellen wir uns vor: a wäre max. 4 Stellen und b von mir aus 2 Stellen. Dann wäre die größte Zahl etwas wie:
9999* 10^99

Wenn wir damit spielen, dann wäre die 1 ein 0001 * 10^0
So kann man immer 1 addieren und kommt dann bis:
9999*10^0

Sobald ich jetzt noch 1 addiere, dann passt das nicht mehr, d.h. die 10.000 passt vorne nicht hin, also verschieben wir um eine Stelle:
1.000*10^1

Nun versuchen wir zu 1.000*10^1 die Zahl 1 dazu zu addieren. Aber wir merken: vorne ist der kleine Schritt, den wir dazu addieren können doch die 10.
==> Mit der Genauigkeit, die wir in diesem Beispiel haben, heisst dies: 1000*10^1 + 1 bleibt 1000*10^1

==> Das dürfte die Problematik erklären, wieso der float irgendwann nicht weiter gezählt wird.


Im Dualen System kommen noch ein paar Spielchen dazu wie eine Normalisierung, aber das soll erst einmal keine Rolle spielen hier.
 

JavaNoob01

Mitglied
Erstmal vielen Dank für Eure Antworten!

Aufgabe 2 habe ich nun verstanden. Ich glaube da habe ich einfach mehr hineininterpretieren wollen als eig. nötig.

Aufgabe 1 muss ich mir morgen nochmal in Ruhe durch den Kopf gehen lassen. Heute brummt mir nur noch der Kopf vor lauter 0en und 1en. Glaube das werd ich mit euren Erklärungen aber auch noch schaffen. Sonst meld ich mich nochmal :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Einige Anfängerfragen (Return-Wert, Exception...) Java Basics - Anfänger-Themen 11
J Einige Anfängerfragen Java Basics - Anfänger-Themen 3
S Erste Schritte Einige Anfängerfragen Java Basics - Anfänger-Themen 5
1 Einige Anfängerfragen Java Basics - Anfänger-Themen 12
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
A Shopping Cart Programm. Verstehe einige Zusammenhänge nicht Java Basics - Anfänger-Themen 1
R Einige Neulingsfragen (Wrapper, GUI-Programmierung) Java Basics - Anfänger-Themen 4
C Einige Fragen zu Frames Java Basics - Anfänger-Themen 7
M Vererbung Methode nur für einige Klassen? Java Basics - Anfänger-Themen 8
S Einige Grundlegende Begriffe Java Basics - Anfänger-Themen 6
P Hilfe bei MultiThreading; Einige Fragen. Java Basics - Anfänger-Themen 14
M JPanel - einige Fragen und Probleme Java Basics - Anfänger-Themen 6
V Java Fenster, einige Probleme und Fragen Java Basics - Anfänger-Themen 5
A RS232 und Microcontroller - einige Fragen Java Basics - Anfänger-Themen 7
G Java Verstaendnis ? und einige Fragen Java Basics - Anfänger-Themen 4
Q Bilderdownload per ftp.einige Bilder defekt Java Basics - Anfänger-Themen 4
D Einige Fragen zu Java Java2D JDBC usw. XD Java Basics - Anfänger-Themen 13
T Listen | und einige Methoden für Listen Java Basics - Anfänger-Themen 11
S einige Fragen: jTextPanel scrollen Java Basics - Anfänger-Themen 2
S Einige Javafragen eines Neulings Java Basics - Anfänger-Themen 10
K Wie werden einige Methoden aufgerufen ? Java Basics - Anfänger-Themen 4
A Einige Fragen zu Files Java Basics - Anfänger-Themen 2
M Anfängerfragen.... Java Basics - Anfänger-Themen 2
E Erste Schritte Verschiedene Anfängerfragen (Rekursion, Terminierung, Schleife, etc.) Java Basics - Anfänger-Themen 5
B 2 Anfängerfragen zu JDK und javac Java Basics - Anfänger-Themen 4
M Sammlung von Anfängerfragen für mein erstes Programm Java Basics - Anfänger-Themen 15
M Anfängerfragen zu GUI Java Basics - Anfänger-Themen 2
J showInputDialog anfängerfragen =D Java Basics - Anfänger-Themen 3
F Anfängerfragen Java Basics - Anfänger-Themen 3
M Anfängerfragen zu Java Applets Java Basics - Anfänger-Themen 4
A 2 anfängerfragen Java Basics - Anfänger-Themen 5
T verschiedene Anfängerfragen Java Basics - Anfänger-Themen 20
N Anfängerfragen und Zugriff auf JTextField Java Basics - Anfänger-Themen 5
T Anfängerfragen von Takeru Java Basics - Anfänger-Themen 4
R Noch ein paar Anfängerfragen. Java Basics - Anfänger-Themen 4
S Ein paar Anfängerfragen Java Basics - Anfänger-Themen 17
B Grobe Anfängerfragen Java Basics - Anfänger-Themen 2
A Kleine Anfängerfragen u.a.: Kann man Random "speichern& Java Basics - Anfänger-Themen 6
B Paar richtige Anfängerfragen Java Basics - Anfänger-Themen 7
J gui anfängerfragen Java Basics - Anfänger-Themen 6
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
T Unterschiedliche Datentypen - worin abspeichern? Java Basics - Anfänger-Themen 18
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
thor_norsk Datentypen unter Java Java Basics - Anfänger-Themen 3
T Datentypen Eigene Datentypen Java Basics - Anfänger-Themen 15
T for-each-Schleife, verschiedene Datentypen Java Basics - Anfänger-Themen 1
G Methoden Methoden mit versch. Datentypen Java Basics - Anfänger-Themen 1
Nicolex3 Größere Datentypen Java Basics - Anfänger-Themen 35
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
mihe7 Von Datentypen und (mehrdimensionalen) Arrays Java Basics - Anfänger-Themen 4
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
W Vergleiche bei generischen Datentypen Java Basics - Anfänger-Themen 7
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
M Datentypen Generische Datentypen - Syntax Java Basics - Anfänger-Themen 25
L Binären Bäume für beliebige Datentypen Java Basics - Anfänger-Themen 15
L Datentypen Ausgabe von eigenem Datentypen Java Basics - Anfänger-Themen 2
T Datentypen Kann Java 2 verschiedene Datentypen vergleichen? Java Basics - Anfänger-Themen 2
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
Queiser Datentypen 2 generische Datentypen für eine Schnittstelle Java Basics - Anfänger-Themen 1
SHasteCode Datentypen Überlauf primitiver Datentypen Java Basics - Anfänger-Themen 4
S Datentypen Java Basics - Anfänger-Themen 14
Antegra Tekkrebell Primitive Datentypen Literal 8072 Java Basics - Anfänger-Themen 21
N Array gleiche Datentypen zusammenrechnen Java Basics - Anfänger-Themen 28
S Datentypen Java Basics - Anfänger-Themen 4
S generische methode mit verschiedenen datentypen Java Basics - Anfänger-Themen 3
H wählen des kleinstmöglichen Datentypen für Gleitkommazahlen. Java Basics - Anfänger-Themen 2
S Datentypen Java Basics - Anfänger-Themen 2
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
J Zusammenhang Numbers und nummerische Datentypen Java Basics - Anfänger-Themen 2
F Variablen unterschiedlicher Datentypen Java Basics - Anfänger-Themen 6
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
D Spezifikation abstrakter Datentypen Java Basics - Anfänger-Themen 3
W Datentypen Datentypen vergleichen Java Basics - Anfänger-Themen 4
B JAVA Datentypen/Überlauf Java Basics - Anfänger-Themen 4
I Erste Schritte HILFE bei Datentypen Java Basics - Anfänger-Themen 2
J Wertebereiche und Datentypen Java Basics - Anfänger-Themen 12
N Methode mit 2 Datentypen. Fehler? Java Basics - Anfänger-Themen 1
N Probleme mit Datentypen Java Basics - Anfänger-Themen 6
S Datentypen Unterschied elementare und zusammengesetzte/strukturierte Datentypen Java Basics - Anfänger-Themen 5
L Beliebigen Datentypen aus String parsen Java Basics - Anfänger-Themen 6
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
K new / Datentypen Java Basics - Anfänger-Themen 3
S Datentypen und ihre Größe Java Basics - Anfänger-Themen 21
T Variablen Varargs und beliebige Datentypen Java Basics - Anfänger-Themen 7
S Datentypen Sonderbehandlung primitiver Datentypen, fixe Konstanteninterpretation Java Basics - Anfänger-Themen 10
G Wertebereiche bei Datentypen Java Basics - Anfänger-Themen 10
G Erste Schritte Über verschiedene Datentypen iterieren. Gibt es sowas? Java Basics - Anfänger-Themen 19
SheldoN Gibt es größere Datentypen als long? Java Basics - Anfänger-Themen 2
S Abfrage Objekt-Array nach Datentypen Java Basics - Anfänger-Themen 6
B Variablen Wie macht man eine call by reference mit primitiven Datentypen in Java? Java Basics - Anfänger-Themen 2
H Mehrer Datentypen aus einer Methode ausgeben. Java Basics - Anfänger-Themen 25
O Array mit unterschiedlichen Datentypen ausgeben... Java Basics - Anfänger-Themen 16
A Generische Datentypen Java Basics - Anfänger-Themen 8
R Input/Output verschiedene Datentypen als Bytes in Datei speichern Java Basics - Anfänger-Themen 15
T ArrayList mit verschiedenen Datentypen verhindern Java Basics - Anfänger-Themen 8
N Bedingung für Datentypen Java Basics - Anfänger-Themen 3
R Array aus verschiedenen Datentypen Java Basics - Anfänger-Themen 29
J Datentypen Datentypen Java Basics - Anfänger-Themen 7
S Datentypen Array fill Methode - unterschiedliche Datentypen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben