Cast zwischen double und long zeitintensiv?
lima-city → Forum → Programmiersprachen → Java
array
aufgefallen
brauch
code
double
einzelnen ziffern
endlosschleife
frage
funktion
integer verbinden
kodierung
moment
potenz
schleife
spielerei
teiler
typ
zahl
zehn
ziffer
-
Ich schreibe mir im Moment eine kleine Klasse für BCD Zahlen. Dabei wird ein Array von int verwendet, wobei je ein int vier Ziffern kodiert. Jedenfalls brauch ich zur Kodierung eines long in das BCDformat die Funktion Math.pow (Potenzen von Zehn um die einzelnen Ziffern auszulesen). Allerdings rechnet die ja mit Fließkommazahlen. Jetzt ist die Frage wäre eine eigene long Funktion dafür angebracht oder gleicht der Geschwindigkeitsvorteil von Zehnerpotenzierung in double die Zeit, die fürs casten benötigt wird aus?
Hier mal der Code:
public BCDNumber( long value, boolean unsigned ) { // long hat maimal 20 ziffern | number ist natürlich vom typ int[] number = new int[5]; for( int i = 5; i >= 0; i-- ) { // die ziffern eines integers einzeln erechnen und durch shiften und addieren in einen integer verbinden for( int ii = 0; ii < 5; ii++ ) { int temp = (int) ( value / (long) Math.pow( 10, i + 4 - ii - 1 ) ); temp = temp << ( 12 - 4 * ii ); number[i] = number[i] + temp; value = value / (long) Math.pow( 10, i + 4 - ii - 1 ); } } // nur eine spielerei if( unsigned ) { add( new BCDNumber( Long.MAX_VALUE ) ); } }
Beitrag zuletzt geändert: 12.12.2010 15:39:16 von reimann -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi reimann,
ich glaube es gibt eine ganz einfach Lösung dafür:
die Funktion Math.pow überhaupt nicht aufzurufen!
Du brauchst diese ja nur als Teiler, um eine Ziffer aus einer Long-Zahl herauszubekommen.
Also warum fängst du z.B. nicht bei z.B. 100000000 an und dividierst in jedem Schleifendurchlauf durch 10.
(oder du fängst bei 1 an und multiplizierst jedes Mal mit 10).
Sollte um einiges schneller sein als Math.pow...
Außerdem rufst du die Funktion zweimal innerhalb der Schleife auf. Wenn's wirklich schnell gehen muss,
würde ich das nur einmal machen und den Wert zwischenspeichern.
Grüßle
PS: Zeile 6: Meinst du wirklich i++ oder nicht doch lieber ii++, soll ja keine Endlosschleife werden:-)))
Beitrag zuletzt geändert: 12.12.2010 15:36:33 von tangoal -
Stimmt. Warum bin ich da nicht drauf gekommen.
Zumindest müsste man es nur einmal vor der Schleife aufrufen.
€dit:
Ja das ist mir auch schon aufgefallen und habs korrigiert.
Beitrag zuletzt geändert: 12.12.2010 15:40:49 von reimann -
Hallo reimann,
könnte es nicht sogar sein, dass es Rundungsfehler gibt, wenn man Math.pow für ganze Zahlen verwenden will?
Es ist zwar so, dass die ganzen Zahlen natürlich bis 2^52 oder so (Länger der Mantisse bei double) als Fließkommazahlen exakt wiedergegeben werden, aber woher weißt du, dass Math.Pow bewusst so programmiert wurde, dass sie mit ganzen Zahlen sauber umgehen kann? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage