Hallo zusammen,
ich bin neu in Sachen Programmierung und habe einige Aufgaben, die mir doch ziemliche Verständnisprobeleme bereiten.
Aufgabe 1:
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.
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.