Skip to Content

1.28 Erste ganze Zahl größer Null die man noch mit int darstellen kann aber nicht mit float Typen

Was ist die erste ganze Zahl größer Null, die man noch mit dem Typ int darstellen kann aber nicht mit dem Typ float?

Geben Sie eine Erklärung die auf dem Zahlenformat der beiden Typen basiert.

Schreiben Sie ein Programm welches diesen Wert berechnet.

Niveau 1
Schwierigkeitsgrad schwer
Zeit

10 Minuten (Herleitung)
15 Minuten (Programmentwicklung)

Die Antwort ist bei der nächsten Frage zu finden (URL rechts unten)

Antwort zu 1.27: Codetransformation

public class CodeTrans1 {
public static void main(String[] args) {
int b = 3;
System.out.println("Erster Durchlauf");
System.out.println("Vorgabe:");
doWhile(b);
System.out.println("nurWhile():");
nurWhile(b);
System.out.println("forSchleife():");
forSchleife(b);
// Zweite Testrunde
System.out.println("Zweiter Durchlauf");
b = 0;
System.out.println("Vorgabe:");
doWhile(b);
System.out.println("nurWhile():");
nurWhile(b);
System.out.println("forSchleife():");
forSchleife(b);
}
/**
* Die Vorgabe der Aufgabe
* @param b
*/
public static void doWhile(int b) {
int i = 0;
String s;
if (b >= 0) { // b ist immer gößer Null!
do {
int k = i * 5;
s = (i % 2 == 0) ? "gerade" : "ungerade";
System.out.println("start():" + k + " ist " + s);
i++; // Schleifeninkrement
} while (i < b);
}
}
public static void nurWhile(int b) {
int i = 0;
String s;
if (b >= 0) { // b ist immer gößer Null!
int k = i * 5;
s = (i % 2 == 0) ? "gerade" : "ungerade";
System.out.println("start():" + k + " ist " + s);
i++; // Schleifeninkrement
while (i < b) {
k = i * 5;
s = (i % 2 == 0) ? "gerade" : "ungerade";
System.out.println("start():" + k + " ist " + s);
i++; // Schleifeninkrement
}

}
}
public static void forSchleife(int b) {
int i = 0;
String s;
if (b >= 0) { // b ist immer gößer Null!
int k = i * 5;
s = (i % 2 == 0) ? "gerade" : "ungerade";
System.out.println("start():" + k + " ist " + s);
for (i = 1; i < b; i++) {
k = i * 5;
s = (i % 2 == 0) ? "gerade" : "ungerade";
System.out.println("start():" + k + " ist " + s);
}

}
}
}

Ergibt die folgende Ausgabe:

Erster Durchlauf
Vorgabe:
start():0 ist gerade
start():5 ist ungerade
start():10 ist gerade
nurWhile():
start():0 ist gerade
start():5 ist ungerade
start():10 ist gerade
forSchleife():
start():0 ist gerade
start():5 ist ungerade
start():10 ist gerade
Zweiter Durchlauf
Vorgabe:
start():0 ist gerade
nurWhile():
start():0 ist gerade
forSchleife():
start():0 ist gerade

 

Die Antwort ist bei der nächsten Frage zu finden (URL rechts unten)

Antwort zu Frage 1.28: Erste ganze Zahl größer Null die man noch mit int darstellen kann aber nicht mit float Typen

16777217

Erklärung

Der Typ int kann alle ganzen Zahlen bis 231-1 darstellen (Siehe)

Der Typ float kann alle ganzen Zahlen darstellen solange der Exponent 20 ist. Wird der Exponent zu 21,  kann der Typ float nur noch jede zweite Zahl genau darstellen.

Der größte Wert den man im Typ float in der Mantisse beschreiben kann ist hat alle 23 Bits gesetzt. Der Wert is also 224-1=16777215.

float kann also noch (224-1)*20 = 16777215 darstellen.

Der nächste Wert kann float auch noch darstellen: 224=16777216. Hier wird ein größerer Exponent verwendet und eine 1 steht in der Mantisse.

Die nächste Zahl 16777217 kann aber von float nicht mehr dargestellt werden. Der Exponent muss größer als 20 sein, da die Mantisse nicht mehr ausreicht. Ist der Exponent aber 21 kann man nur noch jede zweite Zahl genau repräsentieren. Ist der Exponent 22, kann man nur noch jede vierte Zahl genau repräsentieren.

Eine mögliche Implementierung

package javafrage;

public class IntVersusFloat {

public static void main(String[] args) {
int i=0;
float j=0.0f;
while (i==(int)j) {
j++;
i++;
}
System.out.println("i: "+i+", j: "+j);
double k = (int)Math.pow(2, 24);
System.out.println(k);
}
}



blog | by Dr. Radut