Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich soll eine Aufgabe machen, die mir die k-te Wurzel aus a zieht... da die funktion Xn^k-1 enthält und ich keine Methoden, wie "Math.pow(x, k - 1)" verwenden darf, weiß ich jetzt nicht wie ich sonst Xn^k-1 bzw. x^y oder b^x ausrechnen soll... Ich würde mich sehr freuen wenn mir jemand weiter helfen könnte!
public static double ABS(double d){
return (d<0)?-1.0*d:d;
}
public static double POW (double a, int k) {
for (int i=1; i<k; i++)
a *= a;
return a;
}
public static double SQRT(int a, int k) {
double x0=a/k, x1=x0;
while( true ){
x1 = 1.0/k * ( (k-1)*x0 + a / POW(x0,k-1));
if (ABS(x0-x1) < 0.000001)
break;
x0 = x1;
}
return x1;
}
System.out.println( SQRT(7,3) ); //1.912931182772389
Da Du keine Fremdklassen nehmen sollst, habe ich ABS, POW und SQRT mal erzeugt. Ich denke die Namen sind selbsterklärend.
X0 ist immer der Wert aus der vorherigen Iteration und X1 der aktuelle. Die Abbruchbedingung ist, dass die Differenz zwischen beiden keiner 0.000001 ist. Ist dies nicht der Fall, übergibt X1 seinen Wert an X0 und die Prozedur geht von vorn los.
Schön für Dich; bei mir kommt keiner, weil Du vermutlich Copy & Paste einfach genutzt hast ohne drüber nachzudenken.
Code:
public class SQRT {
public static double ABS(double d){
return (d<0)?-1.0*d:d;
}
public static double POW (double a, int k) {
for (int i=1; i<k; i++)
a *= a;
return a;
}
public static double SQRT(int a, int k) {
double x0=a/k, x1=x0;
while( true ){
x1 = 1.0/k * ( (k-1)*x0 + a / POW(x0,k-1));
if (ABS(x0-x1) < 0.000001)
break;
x0 = x1;
}
return x1;
}
public static void main(String[] args) {
System.out.println( SQRT(7,3) );
}
}
Anonymous hat gesagt.:
mit meinem kamen ich schon soweit:
[/code]
Aha. Wenn Du Math.pow(<basis>, <exponent>) hättest nutzen dürfen, wäre die ganze Aufgabe sinnfrei, meinst nicht? Insofern ist gerade dieser Ausdruck:
Code:
x0 = Math.pow(a, 1.0/k);
interessant, da er bereits das Endergebnis enthält und keiner weiteren Berechnung bedarf. Aus Deiner Aufgabenstellung ging doch hervor, das x0=a/k sein soll, oder?
Anonymous hat gesagt.:
Das funktioniert[/code]
Alles andere wäre auch ein Bug in der Math-Klasse. Es funktioniert auch viel kürzer. Um bei Deinem Beispielcode zu bleiben. Du kannst Dir die Berechnung von x1 sparen:
Code:
x0 = Math.pow(a, 1.0/k);
//xn = x0 ;
//z = Math.pow(xn,k-1);
//x1 = (1/k)*((k-1)*xn + ( a /z ));
x1 = x0; //x0 ist bereits das Ergebnis
Out.print("Ergebnis : " + x1);
Schön für Dich; bei mir kommt keiner, weil Du vermutlich Copy & Paste einfach genutzt hast ohne drüber nachzudenken.
Code:
public class SQRT {
public static double ABS(double d){
return (d<0)?-1.0*d:d;
}
public static double POW (double a, int k) {
for (int i=1; i<k; i++)
a *= a;
return a;
}
public static double SQRT(int a, int k) {
double x0=a/k, x1=x0;
while( true ){
x1 = 1.0/k * ( (k-1)*x0 + a / POW(x0,k-1));
if (ABS(x0-x1) < 0.000001)
break;
x0 = x1;
}
return x1;
}
public static void main(String[] args) {
System.out.println( SQRT(7,3) );
}
}
Anonymous hat gesagt.:
mit meinem kamen ich schon soweit:
[/code]
Aha. Wenn Du Math.pow(<basis>, <exponent>) hättest nutzen dürfen, wäre die ganze Aufgabe sinnfrei, meinst nicht? Insofern ist gerade dieser Ausdruck:
Code:
x0 = Math.pow(a, 1.0/k);
interessant, da er bereits das Endergebnis enthält und keiner weiteren Berechnung bedarf. Aus Deiner Aufgabenstellung ging doch hervor, das x0=a/k sein soll, oder?
Anonymous hat gesagt.:
Das funktioniert[/code]
Alles andere wäre auch ein Bug in der Math-Klasse. Es funktioniert auch viel kürzer. Um bei Deinem Beispielcode zu bleiben. Du kannst Dir die Berechnung von x1 sparen:
Code:
x0 = Math.pow(a, 1.0/k);
//xn = x0 ;
//z = Math.pow(xn,k-1);
//x1 = (1/k)*((k-1)*xn + ( a /z ));
x1 = x0; //x0 ist bereits das Ergebnis
Out.print("Ergebnis : " + x1);
zufälliger weiße hatte ich das gleiche Problem :wink:
...hab da auch reinzufällig ne Lösung die dir recht gut gefallen wird
Hier meine Lösung mit einer Funktion:
Code:
class Wurzel{
static final double VERGLEICH=0.000001;
//Festlegen der Startwerte und Berechnung x^k-1
static double power(double basis, int exp){
int helper=1;
double xmine=basis;
//Schleife zur Berechnung x^k-1
while(helper<(exp-1)){
xmine=xmine*basis;
++helper;
}
//Wert Rückgabe an Hauptprogramm
return xmine;
}
public static void main (String[]arg){
double x,count;
int a,k;
//Eingabeabfrage und Bestimmung der Startwerte
Out.print("Wurzel ziehen aus: ");
a=In.readInt();
Out.print("Die wievielte Wurzel ziehen : ");
k=In.readInt();
x=a/k;
//Schlefe der Wurzelformel
do{
count=x;
x=(((k-1)*x+(a/power(x,k)))/k);
}while((count-x)*(count-x)>(VERGLEICH*VERGLEICH));
//Ausgabe
Out.println("Ergebnis: " + x );
}
}
(Wenn du mal Zeit finden solltest würd mich mal interressieren ob du nicht mehr mit mir zutun hast (denke du studierst auch und hattest die gleichen probleme mit Fr.Leopolds aufgabe wie ich))
mfg
PAT_McJAVA (nein ich bin keiner der Korrektöre)