2010-12-15 6 views
0

Ich möchte ein Programm in Java schreiben, die eine Zahl auf eine Potenz erhöht, aber ohne Math.pow ausführen wird. Das Programm sollte generisch sein, um auch Brüche einzubeziehen. Die Schleifeninkrementmethode wird um 1 erhöht, was für Ganzzahlen zulässig ist. aber keine Fraktionen. Bitte schlagen Sie eine generische Methode vor, die für mich hilfreich wäre.Implementieren generische Power-Funktion ohne Math.pow in Java

+0

Warum möchten Sie das tun? Ist es Hausaufgaben? – thejh

+6

"Ohne" ist ein Tag? Heiliger Strohsack. –

+0

@Mark Peters: Aber nur mit 26 markierten Fragen. – thejh

Antwort

0

Denken Sie darüber nach, was eine Power-Funktion tun sollte.

Mathematisch: x^5 = x * x * x * x * x oder ((((x * x) * x) * x) * x)

Innerhalb Ihrer for-Schleife, können Sie der * = Operator, um die Operation zu erreichen, die oben passiert.

Wie gehen Sie mit Brüchen um? Java hat keinen integrierten Fraktionstyp. Es speichert Dezimalstellen, die auf die gleiche Weise wie Ganzzahlen berechnet werden (mit anderen Worten, x * x arbeitet mit beiden Typen). Wenn Sie eine spezielle Klasse für Brüche haben, benötigt Ihre Schleife nur zwei Schritte: einen, um den Zähler zu multiplizieren, und einen, um den Nenner zu multiplizieren.

4

Zuerst beobachten, dass pow (a, x) = exp (x * log (a)).

e x = 1 + x + x /2:

Sie können Ihre eigene exp() Funktion mit der Taylor series Erweiterung für e x implementieren! + x /3! + x /4! + x /5! + ...

Dies funktioniert bei nicht ganzzahligen Werten von x. Je mehr Terme du eingibst, desto genauer wird das Ergebnis sein.

Beachten Sie, dass Sie bei Verwendung einiger algebraischer Identitäten nur auf die Reihenerweiterung für x im Bereich 0 < x < 1 zurückgreifen müssen. exp (int + frac) = exp (int) * exp (frac), und es ist nicht notwendig, eine Reihenentwicklung für exp (int) zu verwenden. (Sie multiplizieren es einfach, , da es eine ganzzahlige Potenz von e = 2.71828 ist ...).

Ebenso können Sie log (x) mit einer dieser Serie Erweiterungen implementieren:

log (1 + x) = x - x /2 + x /3 - x /4 + ...

oder

log (1-x) = -1 * (x + x 2 /2 + x 3 /3 + x 4 /4 + ...)

Aber diese Serien konvergieren nur für x im Intervall -1 < x < 1.Also für Werte von einem außerhalb dieses Bereichs liegt, haben Sie vielleicht die Identität verwenden

log (pq) = log (p) + log (q)

und haben einige wiederholte Teilungen durch e (= 2.71828 ...) bringen ein runter in einen Bereich wo die Serienverbreiterung konvergiert. Wenn zum Beispiel a = 4, müssten Sie x = 3 nehmen, um die erste Formel zu verwenden, aber 3 liegt außerhalb des Konvergenzbereichs. So beginnen wir Faktoren e Dividieren aus:

4/e = 1,47151 ...

log (4) = log (e * 1,47151 ...) = 1 + log (1,47151 ...)

Jetzt können wir nehmen x = .47151 ..., die im Bereich der Konvergenz ist, und log (1 + x) mit der Reihenentwicklung auszuwerten.

0

Während Kräfte auf Wikipedia Lesung bis:

a^x = exp(x ln(a)) for any real number x 

dies Betrug ist?