Hey Leute, muss eine Methode schreiben, die den Logarithmus per Intervallschachtellung und ohne Rekursion berechnet, allerdings kommt im Java-Compiler immer die Meldung "missing return statement". Könnt ihr mir sagen, was ich ändern muss?
public static double logarithmus (int x, int b){
double min = 0.0;
double max = 3.0;
boolean suchen = true;
while (suchen){
double test = (min+max)/2;
double c = Math.pow(b,test);
-Tags schreiben.Das erhöht die Chance, dass ihn jemand liest.Dann muss die Methode immer einen double-Wert zurück liefern, egal, welcher Zweig der if-else-Anweisung abgearbeitet wird.Am besten machst du nur ein return ganz am Ende der Methode.
Erst einmal solltest du den großen roten Text über der Eingabebox beachten und Java-Tags für deinen Code verwenden, das steigert die Hilfsbereitschaft ungemein.
Der Compiler fragt sich, was die Methode zurückgeben soll, wenn die while-Schleife einmal regulär (also wenn such = false wird) verlassen wird. Er kann nicht wissen, dass das bei dir nie passiert. Im Prinzip kannst du dir die Variable such sprachen, und gleich eine Endlosschleife programmieren (was dann auch der Compiler versteht):
Java:
while(true){double test =(min+max)/2;double c =Math.pow(b,test);if(c > x){
test=min;}elseif(c < x){
test=max;}else{return test;}}
Ich gebe jedoch zu bedenken, dass [c]c == x[/c] durch Rundungsfehler eventuell nie erreicht wird. Üblicherweise gibt man eine sehr kleine Maximalabweichung vor (wie EPSILON = 0.0000001), und testet auf [c]Math.abs(c - x) < EPSILON[/c].
Nein, das wäre hier falsch. Wenn, dann muss das return nicht nur hinter das else, sonder hinter die while-Schleife. Das Problem ist nämlich, dass der Compiler nicht erkennt, dass es sich hier "eigentlich" um eine Endlos-Schleife handelt.
wenn ichs so schreibe, kommt die Meldung "cannot find symbol" bei "return test;",verzweifel langsam echt:S
sorry für die dummen Frage, aber bin leider blutiger Anfänger, was Programmiersprachen betrifft...
Nein, das wäre hier falsch. Wenn, dann muss das return nicht nur hinter das else, sonder hinter die while-Schleife. Das Problem ist nämlich, dass der Compiler nicht erkennt, dass es sich hier "eigentlich" um eine Endlos-Schleife handelt.
wenn ichs so schreibe, kommt die Meldung "cannot find symbol" bei "return test;",verzweifel langsam echt:S
sorry für die dummen Frage, aber bin leider blutiger Anfänger, was Programmiersprachen betrifft...
test nicht erst in der Schleife, sondern schon davor deklarieren.
Denn variablen die du in einer schleife deklariert sind auch nur innerhalb dieser sichtbar..
Ich behaupte mal, dass dies alternativ auch mit [c]final boolean such = true;[/c] funktionieren würde Wenn auch etwas speziell... Lieber such auf false setzen.
Dummerweise hat das nichts mit Verstand zu tun, sondern mit "Verständnis" (google mal den Unterschied zwischen den zwei Wörtern) und das fehlt einem noch, wenn man gerade erst-gezwungenerweise- begonnen hat, sich mit Java auseinanderzusetzen.
Trotzdem Danke für den Hinweis.
Hallo,
das return muss aus der Schleife entweder raus und unter diese, oder es muss in jeden Case der Schleife.
Der Compiler weis sonst nicht was er im Falle des ersten Case zurückliefern soll...