Verdammt wo liegt der Fehler?

Status
Nicht offen für weitere Antworten.

alge

Mitglied
Hallo zusammen.

Bin hier am Lernen und kam mit einer Übungsaufgabe auch gut zurecht, doch die Ausgabe des Programms macht nicht wirklich viel Sinn. Jetzt bin ich meinen Code schon xmal durchgegangen und finde einfach den Fehler nicht und das macht mich komplett irre. Kann mir jemand sagen, woran es liegt?

Also die Aufgabe war:

"Die Exponentialfunktion e^x mit der Eulerschen Zahl e als Basis, kann durch folgende
Reihe annäherungsweise berechnet werden:

e^x = (Summenzeichen von n=0 bis n=unendlich) (x^n)/(n!)

Schreiben Sie ein Java-Programm, das den Benutzer zur Eingabe einer Zahl x auffordert
und anschließend den Wert von e^x annäherunsweise ausgibt. Erweitern Sie anschließend
das Programm derart, dass auch die gewünschte Genauigkeit der Berechnung eingegeben
werden kann."

Sorry für die verwirrende Schreibweise der Reihe, aber kp wie ich solche Sonderzeichen hier einfügen kann.

Und hier mein Code:

Code:
import java.io.*;
import java.lang.*;

class euler {
	
	public static void main(String args[]) throws IOException {
		
		System.out.println("Berechnung der Exponentialfunktion e^x");
		System.out.println("");
		System.out.println("Bitte geben sie einen Wert x ein!");
		System.out.println("");
		System.out.flush();
			
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		Double s = Double.valueOf(br.readLine());
		double x = s.doubleValue();
				
		System.out.println("");
		System.out.println("Die Berechnung kann nur näherungsweise erfolgen. Wie viele Durchläufe?");
		System.out.println("");
		System.out.flush();
		InputStreamReader isr2 = new InputStreamReader(System.in);
		BufferedReader br2 = new BufferedReader(isr2);
		String t = br2.readLine();
		int g = Integer.parseInt(t);
		
		int n = 0;
		int ngr;
		int nkl;
		int nz;
		int nf;
		double summe = 0;
		
		while (n < g) {
		ngr = n;
		nf = 1;
			while (ngr >= 2) {
				nkl = ngr - 1;
				nz = ngr*nkl;
				nf = nf*nz;
				ngr = ngr - 2;
			}
		int index = 0;
		double p = 1;
		while (index < n) {
			p = p*x;
			index++;
		}
		double bruch = p/nf;
		n++;
		summe = summe + bruch;
		}
		System.out.println("");
		System.out.print("e^" + x);
		System.out.print(" = " + summe);				
		
		}
	}

Das Programm lässt sich problemlos ausführen, aber die ausgegebenen Werte stimmen meist nicht.

Danke fürs Helfen!!
 

Redfrettchen

Bekanntes Mitglied
Hi,
hast du schon mal daran gedacht, das n! ziemlich schnell ziemlich groß wird und zu einem Überlauf führen könnte? ;)

Gruß
Redfrettchen
 

alge

Mitglied
Redfrettchen hat gesagt.:
Hi,
hast du schon mal daran gedacht, das n! ziemlich schnell ziemlich groß wird und zu einem Überlauf führen könnte? ;)

Gruß
Redfrettchen

Huch, das is wahr :cool:
Das heißt, wenn ich die Durchläufe auf z.B. 10 begrenze, müsste die Aufgabe erfüllt sein, oder nicht? Weil das ist dann wirklich nur noch sehr näherungsweise, aber die Werte bewegen sich im Rahmen.

Gruß zurück
 

Marco13

Top Contributor
Abgesehen davon, dass ein Problem schon darin liegen könnte, dass du dort mit ints rechnest (besser wäre "eigentlich" double, aber für die Fakulatät (Ganzzahlen) wäre zumindest "long" wohl sinnvoller) solltest du überlegen, ob du das nicht etwas "schöner" schreiben könntest. Du könntest z.B. die Funktion Math.pow(x,n) verwenden, und eine (selbstgeschriebene) Methode
long factorial(int n) {...}
 

Redfrettchen

Bekanntes Mitglied
alge hat gesagt.:
Redfrettchen hat gesagt.:
Hi,
hast du schon mal daran gedacht, das n! ziemlich schnell ziemlich groß wird und zu einem Überlauf führen könnte? ;)

Gruß
Redfrettchen

Huch, das is wahr :cool:
Das heißt, wenn ich die Durchläufe auf z.B. 10 begrenze, müsste die Aufgabe erfüllt sein, oder nicht? Weil das ist dann wirklich nur noch sehr näherungsweise, aber die Werte bewegen sich im Rahmen.

Gruß zurück
Ähm, naja, ich denke nicht, dass die Aufgabe so gedacht war...
Dein Konzept ist zwar mathematisch in Ordnung, aber algorithmisch schmerzhaft, weil nicht effizient, implementiert nicht einmal effektiv. Versuch das Endergebnis aus Teilergebnissen zu gewinnen und verwende Teilergebnisse auch wieder.

Von einer factorial-Methode würde ich daher abraten, aber der Einwand mit dem Datentyp ist berechtigt.
 

Marco13

Top Contributor
Die Möglichkeit, Teilerbnisse zu verwenden, ist bei einer "factorial"-Methode oder bei Math.pow natürlich nicht gegeben. Wenn es effizient sein soll, würde man das "eigentlich" machen (und in diesem Fall drängt es sich natürlich auf!), aber wenn es eine Übungsaufgabe sein soll, könnte man auch versuchen, es "schön" zu schreiben. Kommt halt immer drauf an, welche Priorität man setzt. Schneller als Math.pow(Math.E, x); krigt man es sowieso nicht :wink:
 

alge

Mitglied
So, ich hab jetzt mal versucht es "schöner" zu schreiben.

Allerdings will er trotzdem nicht, lässt sich zwar kompilieren, wenn ich es aber ausführen will, kommt eine lange Kette von Meldungen. Woran könnte das jetzt wieder liegen??

Danke nochmal.



Hier der Code:

Code:
import java.io.*;
import java.lang.*;

class eulersch {

public eulersch(){
} 
public static long faculty(int x) {
	int k = x-1;
	long f = 1;
	while (k > 0) {
		f = f*x*k;
		x = x-2;
		k = k-2;
	}
	long z = f;
	System.out.println(z);
	return z;
}

public static double potence(double x, int y) {
	int d;
	double r = 1;
	for (d = 0; d < y; d++) 
		r = r*x;
		return r;
}

public int intread() throws IOException {
	InputStreamReader isr = new InputStreamReader(System.in);
	BufferedReader br = new BufferedReader(isr);
	int d = Integer.parseInt(br.readLine());
	return d;
}

public double doubleread() throws IOException {
	InputStreamReader isr = new InputStreamReader(System.in);
	BufferedReader br = new BufferedReader(isr);
	Double d = Double.valueOf(br.readLine());
	double x = d.doubleValue();
	return x;
}

}

class reihe {
	public static double main(String args[]) throws IOException {
		
		System.out.println("Programm zur näherungsweisen Berechnung von e^x");
		System.out.println("");
		System.out.println("Bitte geben sie ein x ein!");
		System.out.println("");
		System.out.flush();
		eulersch a = new eulersch();
		double x = a.doubleread();
		
		System.out.println("");
		System.out.println("Bitte geben sie die Anzahl der Durchläufe an.");
		System.out.println("");
		System.out.flush();
		int d = a.intread();
		
		int nlauf;
		long f = a.faculty(0);
		double p = a.potence(x, 0);
		double ex = p/f;	
		
		for (nlauf = 0; nlauf < d && f < 1000000; nlauf++)
			f = a.faculty(nlauf);
			p = a.potence(x, nlauf);
			ex = ex+ (f/p);
		
			
		System.out.println("");
		System.out.print("e^" + x);
		System.out.println(" = " + ex);
		return ex;
			}
}
 

Marco13

Top Contributor
main kann kein double zurückgeben, sondern muss void sein.

Ansonsten fehlten bei der Schleife noch geschweifte Klammern
Code:
      for (nlauf = 0; nlauf < d && f < 1000000; nlauf++)
      {
         f = a.faculty(nlauf);
         p = a.potence(x, nlauf);
         ex = ex+ (p/f);
     }

Und es müßte p/f heißen, statt f/p

Und ex sollte am Anfang 0 sein. (oder die Schleife muß bei 1 loslaufen :roll: )

---> ACHTUNG: :meld: Hier fängt der Klugscheiß-Teil an :meld:

java.lang muss man nicht importen.

Klassennamen schreibt man groß.

Dass die "main" eine Exception wirft ... ist höchstens für so ein kleines Übungsprogramm OK.

Die Methoden, die statisch sein können, sollten statisch sein.

Mach mal eine Websuche nach "fast OR schnelle exponentiation"

Variablen sollte man nur dann deklarieren, wenn man sie braucht

Variablen sollte man nur dort deklarieren, wo man sie braucht.

Die Dinger heißten auf englisch übrigens "factorial" und "power".
Aber das nur nebenbei.

Hm. Mal ein zusammengefasster Vorschlag.
Code:
import java.io.*;

class Eulersch
{
    private static long factorial(int x)
    {
        return (x<2?1:x*factorial(x-1));
    }

    private static double power(double x, int y)
    {
        double result = 1;
        while (y!=0)
        {
            if (y%2==1) result*=x;
            x*=x;
            y>>=1;
        }
        return result;
    }

    private static int readInt(String message)
    {
        while (true)
        {
            try
            {
                System.out.print(message);
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                return Integer.parseInt(br.readLine());
            }
            catch (NumberFormatException e) 
            {
                System.out.println("Ungueltige Eingabe!");
            }
            catch (IOException e)
            {
                System.err.println("Fehler: "+e.getMessage());
            }
        }
    }

    private static double readDouble(String message)
    {
        while (true)
        {
            try
            {
                System.out.print(message);
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                return Double.parseDouble(br.readLine());
            }
            catch (NumberFormatException e) 
            {
                System.out.println("Ungueltige Eingabe!");
            }
            catch (IOException e)
            {
                System.err.println("Fehler: "+e.getMessage());
            }
        }

    }

    public static void main(String args[])
    {
        System.out.println("Programm zur naeherungsweisen Berechnung von e^x");
        double x = readDouble("Bitte geben sie ein x ein: ");
        int d = readInt("Bitte geben sie die Anzahl der Durchlaeufe an: ");

        double ex = 0;
        for (int n = 0; n < d; n++) ex+=power(x,n)/factorial(n);

        System.out.print("e^" + x);
        System.out.println(" = " + ex);
        System.out.println("Probe: "+Math.pow(Math.E, x));
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
X Wie verdammt große Datein öffnen? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
T log4j2 Wo liegt mein Logfile? Allgemeine Java-Themen 3
hdi JVM Absturz -> Liegt's am LAF? Allgemeine Java-Themen 5
E Bitcode liegt vor und soll gespiegelt werden Allgemeine Java-Themen 4
R EXE, die in einem JAR liegt, aufrufen Allgemeine Java-Themen 3
T Java Sound Engine: Was liegt drunter? Allgemeine Java-Themen 7
W Herausfinden, wo das Programm liegt. Allgemeine Java-Themen 8
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
S Fehler: <ID> erwartet Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
Pinhg Discord JDA Bot - Fehler Allgemeine Java-Themen 3
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
L Fehler mit Boolean. (Glaube ich zumindest) Allgemeine Java-Themen 6
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
O Fehler bei Variablen Allgemeine Java-Themen 2
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
N nicht einsehbarer Fehler im code, kann nicht mehr übersetzten Allgemeine Java-Themen 51
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
C Fehler bei der Benutzung von itextpdf Allgemeine Java-Themen 1
U Fehler beim Compillieren Allgemeine Java-Themen 13
x46 String Format Fehler Allgemeine Java-Themen 2
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
MiMa Datei verschieben hat einen Fehler?? Allgemeine Java-Themen 20
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
T Java-Quiz Code Fehler Allgemeine Java-Themen 10
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Fehler bei IF abfrage Allgemeine Java-Themen 8
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
M Einheitenrechner - Fehler Allgemeine Java-Themen 12
D Erste Schritte Fehler mit negativen und 0 Zahlen im String Allgemeine Java-Themen 6
T Denk-Fehler? Allgemeine Java-Themen 4
A Finde den Fehler nicht. Allgemeine Java-Themen 7
H Class 'java.io.BuferedReader' is not present in JRE Emulation Libary | GWT Fehler?! Allgemeine Java-Themen 0
D Unbekannter Fehler Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 1
R Fehler im Code Allgemeine Java-Themen 3
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
R Wo ist mein Fehler in diesem Code Allgemeine Java-Themen 7
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
L Fehler bei der Ausführung einer Jar Allgemeine Java-Themen 2
T OOP Fehler im Design Allgemeine Java-Themen 9
Thallius Unfassbarer Fehler. Brauche Ideen zum Debuggen Allgemeine Java-Themen 9
U Eclipse MANIFEST fehler Allgemeine Java-Themen 7
I Fehler bei HashMaps Darstellung Allgemeine Java-Themen 10
R Classnotfoundexception Fehler Allgemeine Java-Themen 3
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
N Compiler-Fehler Warum erhalte ich einen Nullpointer Fehler? Allgemeine Java-Themen 2
N Prim's Algorithm - wo ist der Fehler? Allgemeine Java-Themen 3
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
M Line-Fehler Allgemeine Java-Themen 8
U Input/Output Warum wirft mir das Programm diesen Fehler? Allgemeine Java-Themen 6
RalleYTN Merkwürdiger Fehler mit JFrame im Vollbild Allgemeine Java-Themen 4
V AudioInputStream Fehler Allgemeine Java-Themen 1
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
G Fehler mit Vector Allgemeine Java-Themen 3
F Java Fehler "buildTableModel" Allgemeine Java-Themen 3
F Fehler in Zeile in Log schreiben Allgemeine Java-Themen 6
DanielsLPecke Input/Output Arduino komischer Fehler. Allgemeine Java-Themen 38
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
S Hashtable Fehler Allgemeine Java-Themen 14
S Zwei String vergleichen, Fehler markieren Allgemeine Java-Themen 3
C Hilfe bei einer Fehler meldung Allgemeine Java-Themen 3
K Was ist mein Fehler? Allgemeine Java-Themen 2
Tausendsassa Compiler-Fehler Fertiges Programm mit Fehler Allgemeine Java-Themen 10
B Eclipse Nach Export einer .jar Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 5
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
P Java Fehler auf Win2008 Server java.io.FilePermission IE8 Version JRE 1.7.0_51 Allgemeine Java-Themen 7
M Eclipse - Fehler: Hauptklasse de.xyz.init.MeineKlasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
Seikuassi Swing Stehe auf dem Schlauch...(BufferedReader_Writer-Fehler?) Allgemeine Java-Themen 4
M Eclipse Fehler beim Installieren des Plugins "Jigloo" Allgemeine Java-Themen 12
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
B Fehler bei einem Programm Allgemeine Java-Themen 10
F HILFEEEEEE JAVA Fehler - Tiny Umbrella Allgemeine Java-Themen 1
N JavaFX IndexOutOfBounds-Fehler Allgemeine Java-Themen 11
N GPIB - Fehler: Unable to open device Allgemeine Java-Themen 1
S Ganzes Programm "stucked" - JVM-Fehler? Allgemeine Java-Themen 2
D Variablen Ausgabe bzw. einlese Fehler Allgemeine Java-Themen 7
I Fehler java.lang.NullPointerException Allgemeine Java-Themen 5
B NullPointerException - Aber kein Fehler im Code Allgemeine Java-Themen 4
B Eclipse Fehler in eclipse/Java Allgemeine Java-Themen 13
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
H JUnit Fehler beim Compilieren - erledigt Allgemeine Java-Themen 0
J Fehler beim parsens eine Datums Allgemeine Java-Themen 3
A Thread Fehler absichtlich provozieren Allgemeine Java-Themen 3
J Compiler-Fehler .nextLine fehler Allgemeine Java-Themen 3
B Fehler im Java-Code Allgemeine Java-Themen 4
S Java Fehler bei Konsolenprogramm Allgemeine Java-Themen 2
N Was ist ein Fehler (Requirement-Engineering) Allgemeine Java-Themen 3
C System.out.print("") Compiler Fehler Allgemeine Java-Themen 2
T Programm bleibt ohne Fehler stehen Allgemeine Java-Themen 4
G Fehler beim instanzieren einer Generischen Klasse Allgemeine Java-Themen 5
K Eclipse Fehler beim Ausführen meines Programms in Eclipse Allgemeine Java-Themen 11
K Input/Output Fehler bei Dateierzeugung Allgemeine Java-Themen 7
M Fehler bei Remoteinstallation von Java Allgemeine Java-Themen 5
M Fehler bei Verwendung von TexturePaint Allgemeine Java-Themen 16

Ähnliche Java Themen


Oben