Wurzelberechnung n-ter Ordnung (Geometrisches Mittel)

sense42

Neues Mitglied
Hallo!

Ich möchte eine einfache Methode implementieren die das Geometrische Mittel berechnet.

Das habe ich auch schon getan, jedoch bin ich auf eine Kleinigkeit gestoßen die mich stutzig macht.

Mein Code:

getMesswerte() holt sich ein float array.

Java:
	public float berechnung() {

		float sum = 1;

		for (int i = 0; i < getMesswerte().length; i++) {

			sum = sum * getMesswerte()[i];

		}

		double x1 = getMesswerte().length;
		double x2 = 1 / x1;

		return (float) Math.pow(sum, x2);

	}

Der Code funktioniert und liefert des korrekte Ergebnis.

Mein Ursprünglicher Code war:

Java:
	public float berechnung() {

		float sum = 1;

		for (int i = 0; i < getMesswerte().length; i++) {

			sum = sum * getMesswerte()[i];

		}

		return (float) Math.pow(sum, 1/ getMesswerte().length);

	}

Dieser hat jedoch nicht den richtigen Wert ausgegeben, es war null oder eins.

Jetzt frage ich mich, warum hat das erst nach dem "zerpflücken" der Berechnung der Wurzel funktioniert?

Grüße!:)
 

AmunRa

Gesperrter Benutzer
Um das ganze vl noch etwas genauer zu beschreiben.

Code:
1/ getMesswerte().length

liefert immer 0 als Ergebnis (außer das Array hat genau einen eintrag).

Die begründung ist die die Volvagia schon gegeben hat.
1 ist ein int und getMesswerte().length ist auch ein int. daher kommt hier ein int heraus und der ist daher immer 0.



Bei der funktionierenden Version wandelst du getMesswerte().length in einen double um.
Dort wird nun 1 durch einen double Wert dividiert und daher kommt als ergebnis ein double heraus der auch einen Wert zwischen 0 und 1 annehmen kann.
 

sense42

Neues Mitglied
Danke für die schnelle Antwort!

Ich führ den Cast einfach gleich bei dem return wert aus:

Java:
	public float berechnung() {

		float sum = 1;

		for (int i = 0; i < getMesswerte().length; i++) {

			sum = sum * getMesswerte()[i];

		}

		return (float) Math.pow(sum, 1 / (double) getMesswerte().length);

	}

Würdet ihr die lösung so empfehlen?
 

Volvagia

Top Contributor
Deine Entscheidung.
Der Cast sorgt für weniger dafür längere Zeilen und da du die Werte die gecastet werden nicht geklammert hast ist er imho nicht ganz so durchsichtig. Andererseits fragt man sich da nicht, warum du diese Variable angelegt hast.
Ich persönlich würde einen Mix vorziehen. 1/((double)lenght) ausrechnen und in der nächsten Zeile das Pow.
 

Ähnliche Java Themen

Neue Themen


Oben