Berechnung der n-ten Wurzel in Java

1. Übersicht

Der Versuch, die n-te Wurzel in Java mit pow () zu finden, ist in einigen Fällen ungenau. Der Grund dafür ist, dass doppelte Zahlen unterwegs an Genauigkeit verlieren können. Daher müssen wir möglicherweise das Ergebnis polieren, um diese Fälle zu behandeln.

2. Das Problem

Angenommen, wir möchten die N-te Wurzel wie folgt berechnen:

base = 125, exponent = 3

Mit anderen Worten, welche Zahl hoch 3 ist 125?

Es ist vorgesehen, dass die n-te Wurzel einer Zahl x gleich der Zahl x in der Potenz von 1 / n ist . Also übersetzen wir unsere Gleichung in:

N-th root = Math.pow(125, 1/3)

Das Ergebnis ist 4.999999999999999. Und 4,999999999999999 hoch 3 ist nicht 125. Wie können wir das beheben?

3. Die N-te Wurzel richtig berechnen

Die Lösung für das oben genannte Problem ist meistens eine mathematische Problemumgehung und so einfach wie es nur geht. Es ist bekannt, dass die n-te Wurzel einer Zahl x gleich der Zahl x in der Potenz von 1 / n ist .

Es gibt einige Möglichkeiten, die obige Gleichung zu nutzen. Erstens können wir ein BigDecimal verwenden und unsere Version der Newton-Raphson-Methode implementieren. Zweitens können wir das Ergebnis auf die nächste Zahl runden und schließlich eine Fehlerquote definieren, bei der die Ergebnisse akzeptabel sind. Wir werden uns auf die letzten beiden Ansätze konzentrieren.

3.1. Runden

Wir werden jetzt Rundungen verwenden, um unser Problem zu lösen. Lassen Sie uns unser vorheriges Beispiel wiederverwenden und sehen, wie wir das richtige Ergebnis erzielen können:

public void whenBaseIs125AndNIs3_thenNthIs5() { double nth = Math.round(Math.pow(125, 1.0 / 3.0)); assertEquals(5, nth, 0); }

3.2. Fehlermarge

Dieser Ansatz ist dem oben genannten sehr ähnlich. Wir müssen nur eine akzeptable Fehlergrenze definieren, nehmen wir 0,00001 an:

public void whenBaseIs625AndNIs4_thenNthIs5() { double nth = Math.pow(625, 1.0 / 4.0); assertEquals(5, nth, 0.00001); }

Der Test zeigt, dass unsere Methoden die n-te Wurzel korrekt berechnen.

4. Fazit

Als Entwickler müssen wir die Datentypen und ihr Verhalten verstehen. Die oben beschriebenen mathematischen Methoden funktionieren sehr gut mit ziemlich guter Genauigkeit. Sie können diejenige auswählen, die besser zu Ihrem Anwendungsfall passt. Den Code für die obige Lösung finden Sie auf GitHub.