fibonacci - do while Statement Logik Fehler

Phil_Smith

Mitglied
Hallo Zusammen
Ich versuche gerade in Java ein kleines fibonacci Programm zu schreiben und komme dabei mit meinem do while Statement nicht weiter. Das Problem ist, dass die do While Schlaufe spätestens aufhören sollte, wenn der maximale Long Wert überschritten/erreicht wird, das tut es aber nicht. Was ist an meiner do while Bedingung falsch?

Java:
import java.util.Scanner;

public class fibonacci {

	public static void main(String[] args) {
		
		int input;
		long zahl1 = 0;
		long zahl2 = 1;
		int wiederholung = 0;
		long ergebnis = 0;
		
		Scanner in = new Scanner (System.in);
		
		System.out.print("Geben Sie eine positive ganzzahlige Zahl ein: ");  
		input = in.nextInt();
		System.out.println("Sie haben " + input + "eingegeben.");
		do {
			if (wiederholung == 0) {
				System.out.println("Ergebnis: " + zahl1);
				System.out.println("Ergebnis: " + zahl2);
			} else {
				ergebnis = zahl1 + zahl2;
				System.out.println("Ergebnis: " + ergebnis);
				zahl1 = zahl2;
				zahl2 = ergebnis;
			}
			wiederholung++;
			System.out.println("Wiederholung Nummer: " + wiederholung);
		} 
		while ((wiederholung < input) && (ergebnis <= Long.MAX_VALUE));
		
		in.close();
	}
}
Warum wird meine do while Schlaufe nicht beendet sobald das "ergebnis" grösser als "Long.MAX_VALUE" ist?
Interessant ist vor allem, die Wiederholung Nummer 93:

HTML:
Wiederholung Nummer: 90
Ergebnis: 4660046610375530309
Wiederholung Nummer: 91
Ergebnis: 7540113804746346429
Wiederholung Nummer: 92
Ergebnis: -6246583658587674878
Wäre sehr dankbar über eine hilfreiche Antwort.

Vielen Dank.

Gruss Phil
 
Der Long hat 64bit Größe. 63 sind davon für die Zahl, 1 Bit für das Vorzeichen. Wenn eine Zahl zu groß wird, dann springt das Vorzeichen um. Mit ergebnis <= Long.MAX_VALUE kannst du nicht prüfen, ob der Wert über die maximale Größe geht, da du in diesem Fall wieder im negativen Bereich landest.
Überhaupt, wie stellst du dir vor, dass du prüfst, ob eine Zahl größer als ihr Wertebereich ist? MAX_VALUE ist der maximale positive Wert eines Longs. Somit kann Long keine größere Zahl annehmen.
 
Das Ganze wird abgebrochen, wenn ergebnis größer ist, als Long.MAX_VALUE aber ein long kann keinen größeren Wert, als Long.MAX_VALUE beinhalten. Das ist ja gerade die Aufgabe dieser Konstante. 😉
Und, selbst wenn es doch funktionieren würde (zahl1 usw. wären double) dann würdest du es erst nach der Addition überprüfen. Das heißt, du würdest den Fehler begehen und dann prüfen, ob du einen Fehler gemacht hast und nicht andersrum.

Die Differenz von zahl1 zu Long.MAX_VALUE muss größer oder gleich zahl2 sein. Dann gibt es keinen Overflow. Also (Long.MAX_VALUE - zahl1) >= zahl2
 
Vielen Dank für eure Antworten.. Ja, klar im Nachhinein ergibt es Sinn, dass man ein long nicht auf dessen maximalen Wertebereich prüfen kann, wenn man diesen bereits überschritten hat :bloed:.. Mein korrigierter Code sieht nun wie gefolgt aus:
Java:
import java.util.Scanner;

public class fibonacci {

	public static void main(String[] args) {
		
		int input;
		long zahl1 = 0;
		long zahl2 = 1;
		int wiederholung = 0;
		long ergebnis = 0;
		
		Scanner in = new Scanner (System.in);
		
		System.out.print("Geben Sie eine positive ganzzahlige Zahl ein: ");  
		input = in.nextInt();
		System.out.println("Sie haben " + input + "eingegeben.");
		do {
			if (wiederholung == 0) {
				System.out.println("Ergebnis: " + zahl1);
				System.out.println("Ergebnis: " + zahl2);
			} else {
				ergebnis = zahl1 + zahl2;
				System.out.println("Ergebnis: " + ergebnis);
				zahl1 = zahl2;
				zahl2 = ergebnis;
			}
			wiederholung++;
			System.out.println("Wiederholung Nummer: " + wiederholung);
		} 
		while ((wiederholung < input) && ((Long.MAX_VALUE - zahl1) >= zahl2));
		
		in.close();
	}
}
 

Zurück
Oben