kleines problem mot selbsgeschriebener exponenten funktion...
-
Sollen in Java aber wäre ja in c++ die gleiche funktion, eine Funktion schreiben die einen exponenten ausrechnet... x hoch y.
x und y werden übergeben.
habs bisher so,und klappt auch für zulässige positive werte soweit:
public static double ipow(double x, int y) { double erg = 0; if (y == 0) return (1); if (y % 2 == 0) erg= ipow(x, y / 2) * ipow(x, y / 2); else erg= x * (ipow(x, (y - 1) / 2) * ipow(x, (y - 1) / 2)); return(erg); }
jetzt hakt es aber das ich einbauen wollte, wenn y negativ ist,das das gesamtergebnis ja 1 durch ... lauten muss...
Nur wenn ich das in die Funktion per if abfrage einbaue, dann macht er immer nen overfklow,weil ja die zwischenergebnisse der rekursion auch 1 durch gerechnet werden und so.
Ich bräuchte etwas wo erst die funktion komplett durchgearbeitet wird,und dann abgefragt wird, aber wie bekomme ich das dann in die eine Funktion ?
-
Hi
Mach das so.
Du hast eine public static Methode die verwendest du um die Methode nutzen zu können. In dieser public Methode schaust du auch nach ob dein y negativ ist oder nicht.
Falls y positiv dann rufe private static Methode von ipow auf.
Falls y negativ dann rufe private static Methide von ipow auf und teile 1 druch Ergebnis.
if (y >0) return ipow(x, y); else if (y<0) return 1/ipow(x, y);
Du muss die eine Private methode haben, die das ganze dann rekursiv errechnet.
Müsste eingelntlich so klappen.Viel spass
BYE BYE
-
ja das es so geht is klar,will aber das man nur die methode ganz normal aufruft, und alles in dieser methode berechnet wird.
-
Dann kapsele doch das was CoTech gesagt hat in der ipow-Methode, die wiederum deine Originale ipow-Methode mit den Veränderungen von CoTech aufruft und anders heisst. Damit würdest du auch nur einen Befehl aufrufen.
-
das klappt nicht,weil er die überprüfung in jeder rekursion machen würde,und jedesmal auch immer 1 durch berechnet, soll aber nur von gesamt ergebnis.
Ausserdem gehts auch nicht als extra methode, gibt auch einen stack overflow error..
-
Ich kenn mich ja nicht aus wie man den Exponenten berechnet aber warum muss es nur in einer Methode sein das verstehe ich nicht.
Ist das eine vorgabe des Profs oder Lehrers.Ich hab das mal getestet und es Funktioniert.
public class MyMAth { public static double ipow(double x, int y) { if (y >= 0){ return ipowPriv(x, y); } return 1/ipowPriv(x, Math.abs(y)); } private static double ipowPriv(double x, int y) { double erg = 0; if (y == 0) return (1); if (y % 2 == 0) erg = ipowPriv(x, y / 2) * ipowPriv(x, y / 2); else erg = x * (ipowPriv(x, (y - 1) / 2) * ipowPriv(x, (y - 1) / 2)); return (erg); } public static void main(String[] args){ System.out.println("Das ergebnis: " + ipow(2, -6)); } }
Der Fehler tritt immer dann nur auf wenn du vergisst die Negative Zahl zu einer Positiven zahl umzuwandeln.
Dafür ist die Methode Math.abs(y)Hab vergessen die 0 abzufangen
-
ist zwar schon gelöst,aber das wäre mein Lösungsansatz gewesen um es in 1 Methode zu bringen:
public static double ipow(double x, double y) { double erg = x; double yNew=Math.abs(y); if(y==0) { return 1; } else { for(int i=1;i<yNew;i++) { erg*=x; } if(y>0) return erg; else return 1/erg; } }
ist zwar nicht ganz so elegant wie eure Lösung,aber sollte ihren Zweck erfüllen
Falls jemand nen grundlegenden Denkfehler bei mir finden sollte,bitte meldenGruß
Canse78
-
ich soll per hand potenzieren, klappt auch alles, nur sollen jetzt noch die Ausnahmefälle behandelt werden,und ich weis snicht genau was, wie z.v. isNAN, positive_Infinty und sowas alles,und wie ich es einbaue, hab vbislang folgendes:
public static double ipow(double x, int y) { if(x==0 && y==0) throw new ArithmeticException("Eingabe nicht zulässig"); if(Double.isNaN(x)) throw new ArithmeticException("X ist keine gültige Zahl"); else if (y >=0) return ipowPriv(x, y); else return (1/ipowPriv(x,y*-1)); }