Überlauf Fakultät

Status
Nicht offen für weitere Antworten.

vbtricks

Mitglied
Salut,

ich schaue mir zur Zeit Java an, habe bis jetzt vornehmlich mit C# gearbeitet. Dabei gibt es einige Gemeinsamkeiten aber natürlich auch Unterschiede. Mit folgender Funktion will ich die Fakultät berechnen:
Code:
  private static int Faculty(int Number)
  {
  	int product = 1;
  	for(int i = 1; i <= Number; i++)
  	{
  		product *= i;
  	}
  	return product;
  }
Das gibt selbstverständlich einen Überlauf, bloß bekomme ich leider keine Exception, sondern einfach nur falsche Ergebnisse. Wie behandle ich das denn am besten?

Dann möchte ich noch eine eher theoretische Frage anschließen:
Ich könnte das ganze ja auch rekursiv programmieren. Gehe ich aber richtig in der Annahme, dass das nicht so sinnvoll ist, da für jeden rekursiven Aufruf entsprechend Platz für die Variablen reserviert werden muss, und das ganze somit langsamer wird?


Stefan
 

Leroy42

Top Contributor
Der zusätzliche Zeitaufwand bei rekursiver Berechnung
der Fakultäten macht sich erst dann bemerkbar, wenn du
einige 100 000 mal Fakultäten berechnest. Bei einer so
einfachen Umwandlung in eine iterative Methode würde
ich die Fakultät dennoch iterativ berechnen.

Überlauf festzustellen ist schon umständlicher. Du müsstest vor
jeder Multiplikation auf einen Überlauf testen, etwa so

Code:
if (Integer.MAX_VALUE / i > product)
  throw new Exception(...)

Wenn du long statt int benutzst, kannst du entsprechend
größere Fakultäten berechnen. Wenn du aber beliebig
große Fakultäten berechnen willst, bleibt dir nur der Weg
über BigInteger:

Code:
BigInteger faculty(int n) {
  return n == 0 ? BigInteger.ONE : new BigInteger(n).multiply(faculty(n-1));
}
 

Zunera

Aktives Mitglied
Hi,

Leroy42 hat eigentlich schon alles gesagt. Außer das der mathematische Begriff "Fakultät" im englischen "factorial" heißt - "faculty" klingt ähnlich, hat aber nix mit der mathematischen Operation zu tun... :noe:

PS: Die Exception könnte man auch einfach mit
Code:
if(product <= 0) throw new RuntimeException("Result out of range!");
werfen.
 

vbtricks

Mitglied
Salut,

danke für die Antworten, hat mir weitergeholfen.

PS: Die Exception könnte man auch einfach mit
Code:
if(product <= 0) throw new RuntimeException("Result out of range!");
werfen
Woher kann ich mir sicher sein, dass du falsche Wert Nicht-Positiv ist? Ist das immer so, oder funktioniert das nur bei dem Beispiel? Hatte ich beim Debuggen zwar auch gesehen, wollte da aber keine voreiligen Rückschlüsse ziehen.


Stefan
 

byte

Top Contributor
Das "letzte" Bit wird jeweils als Vorzeichen interpretiert. Das heisst, irgendwann ist das Produkt größer als 2^31 - 1 und somit negativ.

Wenn Du aber weiterrechnen würdest, dann würde das Produkt irgendwann natürlich auch wieder positiv werden, nämlich bei MAX_VALUE * MAX_VALUE.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
SHasteCode Datentypen Überlauf primitiver Datentypen Java Basics - Anfänger-Themen 4
K Überlauf Java Basics - Anfänger-Themen 13
B JAVA Datentypen/Überlauf Java Basics - Anfänger-Themen 4
T Überlauf? Java Basics - Anfänger-Themen 9
J Überlauf verhindern Java Basics - Anfänger-Themen 4
J Auf Überlauf prüfen Java Basics - Anfänger-Themen 14
O Überlauf durch Multiplikation Java Basics - Anfänger-Themen 7
L mit Fakultät mathematische Formel berechnen Java Basics - Anfänger-Themen 5
K Fakultät Java Basics - Anfänger-Themen 5
B Java Array Fakultät Function Java Basics - Anfänger-Themen 5
K Rekursive Methode für Fakultät mit BigInteger Java Basics - Anfänger-Themen 10
I Datentypen Warum so nur Fakultät nur bis 8? Java Basics - Anfänger-Themen 5
K Fakultät Java Basics - Anfänger-Themen 16
C Erste Schritte Negative Zahlen als Fakultät ablehnen Java Basics - Anfänger-Themen 2
P Problem bei Fakultät mit "for"-Schleife Java Basics - Anfänger-Themen 12
M Fakultät berechnen Java Basics - Anfänger-Themen 2
A Fakultät probleme Java Basics - Anfänger-Themen 1
Z Schleifen Beispiel: Fakultät Java Basics - Anfänger-Themen 26
P Fakultät aus Zahl bilden Java Basics - Anfänger-Themen 5
K Fakultät zurückrechnen Java Basics - Anfänger-Themen 7
V Rekursion und Fakultät Java Basics - Anfänger-Themen 4
N Fakultät Java Basics - Anfänger-Themen 9
P Methoden Fakultät und Fehlerwert berechnen Java Basics - Anfänger-Themen 7
Fab1 Project Euler problem20 Fakultät von 100 Java Basics - Anfänger-Themen 13
S Erste Schritte Fakultät Quellcode Java Basics - Anfänger-Themen 12
L Fakultät Java Basics - Anfänger-Themen 2
G vielfache, fakultät und primzahltest Java Basics - Anfänger-Themen 35
M Fakultät Java Basics - Anfänger-Themen 13
J Fakultät- Programm programmieren Java Basics - Anfänger-Themen 10
W Fakultät, warum Endlosschleife? Java Basics - Anfänger-Themen 15
W Fakultät Java Basics - Anfänger-Themen 9
J Fakultät und Rekursion Java Basics - Anfänger-Themen 9
L Fakultät Programm ! Java Basics - Anfänger-Themen 7
M Problem mit Berechnung der Fakultät Java Basics - Anfänger-Themen 3
B Berechnugn der Fakultät Java Basics - Anfänger-Themen 3
M Fakultät berechnen Java Basics - Anfänger-Themen 2
R Fakultät einer Zahl errechnen. Java Basics - Anfänger-Themen 7
M Brauche Hilfe mit Fakultät! Java Basics - Anfänger-Themen 16
N java befehl für fakultät Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben