Potenzieren ohne vorgegebene Methoden!

Status
Nicht offen für weitere Antworten.

Lexe

Mitglied
Hi,

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!

Vielen Dank schon mal im Vorraus xD!

mfG

Lexe :wink:
 
Bitte schön 😉

Code:
		public static double hoch(double x, int k) {
		boolean neg = false;
		double tmp = 1;
		if (k < 0) {
			k *= -1;
			neg = true;
		}
		while ( k-- > 0 )
			tmp *= x;
		if (neg)
			return 1 / tmp;
		return tmp;
	}
 
Hi,

Problem in drei Methoden zerlegt:

Code:
  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.

Gruß Micha
 
danke erstmal für die schnelle antwort

irgendwie kommen bei mir fehler....

mit meinem kamen ich schon soweit:



public class Wurzel1 {


public static void main(String[] args) {



double a, z,k, x1, x0, xn;
Out.print ("Wurzel ziehen : ");
a = In.readInt();
Out.print("Die wievielte Wurzel ziehen: ");
k = In.readInt() ;



x0 = Math.pow(a, 1.0/k);
xn = x0 ;
z = Math.pow(xn,k-1);

x1 = (1/k)*((k-1)*xn + ( a /z ));

Out.print("Ergebnis : " + x1);

}

}




Das funktioniert, aber da fehlen mir die methoden, ich weiß nicht wie ich die methoden rein bekomme

weiß du es?
 
danke erstmal für die schnelle antwort

irgendwie kommen bei mir fehler....

mit meinem kamen ich schon soweit:



public class Wurzel1 {


public static void main(String[] args) {



double a, z,k, x1, x0, xn;
Out.print ("Wurzel ziehen : ");
a = In.readInt();
Out.print("Die wievielte Wurzel ziehen: ");
k = In.readInt() ;



x0 = Math.pow(a, 1.0/k);
xn = x0 ;
z = Math.pow(xn,k-1);

x1 = (1/k)*((k-1)*xn + ( a /z ));

Out.print("Ergebnis : " + x1);

}

}




Das funktioniert, aber da fehlen mir die methoden, ich weiß nicht wie ich die methoden rein bekomme

weiß du es?
 
Hi,

Anonymous hat gesagt.:
irgendwie kommen bei mir fehler....

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);


Anonymous hat gesagt.:
ich weiß nicht wie ich die methoden rein bekomme
Was hast Du versucht?

Gruß Micha
 
Hi,

Anonymous hat gesagt.:
irgendwie kommen bei mir fehler....

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);


Anonymous hat gesagt.:
ich weiß nicht wie ich die methoden rein bekomme
Was hast Du versucht?

Gruß Micha
 
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)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben