ganzzahlige Potenz schnell berechnen

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Habe eine Gleitkommazahl als Basis und eine ganzzahlige positive Zahl als Exponent

Math.pow(base,exp) verwended StrictMath und das ist grottig langsam.
Code:
double result = 1;
for (int i = 0; i < exp; i++){
    result *= base;
}
ist schon sehr viel besser, bei kleinen Exponenten schön schnell aber mein Exponent kann aber bis zu 1000 groß werden und das ist dann schon wieder sehr langsam.

Muss mehrere Milliarden solcher Berechnungen durchführen mit verschiedenen Basen und Exponenten und will nicht jedes mal Tage auf das Ergebnis warten.

Das muss man doch wesentlich beschleunigen können, z.B. die Zahl halbieren und nur die erste Hälfte "zusammenmultiplizieren" und dann das quadrat davon und man hat das Ergebnis. das ganze dann noch rekursiv, also Divide&Conqer und ratz fatz hat man das Ergebnis.
Bevor ich aber sowas selbst programmiere: gibts da noch eine bessere Lösung und gibts sowas vielleicht schon fertig als Algorithmus?
 

0x7F800000

Top Contributor
bevor du sowas programmierst, solltest du dir im klaren sein, dass 2^1000 eh niemals in ein integer oder ein long reinpasst, erst recht keine Zahlen größer als 2.

Da müsstest du schon BigInteger nehmen. Wenn dort die Potenzierung nicht implementiert ist, dann mach's mit square & multiply, das was du gemeint hast verstehe ich nicht so recht.
 
G

Guest

Gast
Die Zahlen liegen dicht an 1, z.B. 1.01 oder 0.99 und das Ergebnis kommt in ein double, desshalb gibts keine Probleme mit der Größe der Zahl.
 

0x7F800000

Top Contributor
achsoo, sowas wie "double^int" willst du also, ohne die blöden logarithmen ausrechnen zu müssen? Ja, das ist verständlich, :toll: .

Mit großen Ganzen zahlen würde das etwa so gehen:
Code:
     public static BigInteger pow(BigInteger base, BigInteger exp){
		BigInteger result=BigInteger.ONE;
		for(int i=0; i<exp.bitCount(); i++){
			if(exp.testBit(i)) result=result.multiply(base);
			base=base.multiply(base);
		}
		return result;
	}

mit double^int geht das völlig analog:

Code:
	public static double pow(double base, int exp){
		double result=1;
		while(exp>0){
			if( (exp&1)==1 ) result*=base;
			base*=base;
			exp>>=1;
		}
		return result;
	}

weiß jetzt nicht ob das wirklich schneller ist? ???:L

edit: hehe, ~16 mal schneller, goil^^ :p
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
B BlueJ Potenz Berechnung Allgemeine Java-Themen 16
L Einfache Navigations-App schnell selber Programmieren? Bitte um Ideen und Anregungen. Allgemeine Java-Themen 17
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
T Collections Liste schnell/nebenläufig durchgehen Allgemeine Java-Themen 2
S Schnell eine fortlaufende nummer erzeugen SQL, kein Primkey Allgemeine Java-Themen 8
M Bilderstapel schnell durchschalten? Speicherprobleme. Allgemeine Java-Themen 3
A Möglichkeiten, ein Bild schnell auszuwerten Allgemeine Java-Themen 56
parite.b schnell frage ;) API CONTENTS ? Allgemeine Java-Themen 5
E brauche schnell Ausführbare Datei Allgemeine Java-Themen 4
T Serialisierung: Wie macht RMI das so schnell? Allgemeine Java-Themen 14
G schnell Strings vergleichen Allgemeine Java-Themen 4
G Datenbank-Anwendung schnell erstellen. Allgemeine Java-Themen 7
J Datei Inhalt vergleichen (schnell & effizient!) Allgemeine Java-Themen 10
M Schnell kleine Hilfe gesucht! Allgemeine Java-Themen 3
C Daten möglichst schnell einem Baum zuordnen Allgemeine Java-Themen 2
M 2-dimensionalen array schnell kopieren Allgemeine Java-Themen 6
G Soundsamples schnell hintereinander abspielen Allgemeine Java-Themen 4
T Bilder schnell in BufferedImage laden Allgemeine Java-Themen 4
A mein Frame wird nicht schnell genung aktualisiert Allgemeine Java-Themen 7
F Große Dateien schnell einlesen Allgemeine Java-Themen 14

Ähnliche Java Themen

Neue Themen


Oben