Jellysheep
Erfahrenes Mitglied
Wozu brauchst du denn noch die Variable potenz?
Sie ist nie in Gebrauch.
Sie ist nie in Gebrauch.
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
if ( n == 0 ) return 1;
if ( n == 1 ) return x;
if ( n%2 ...
Das hat mit der Maschinenabhängigkeit der Compiler-Implementierung zu tun. Auf manchen Systemen ist ein int so groß wie ein short, auf anderen kann er so groß sein wie ein long. Es steht jedem Übersetzer frei, short und long so zu interpretieren, wie es für seine Maschine sinnvoll ist. Eigentlich kann man sich nur darauf verlassen, dass short nicht länger ist als long. Für die Fließkommatypen gilt das entsprechend.// EDIT: Bis 2^1023 geht in double bei mir rein, long double ist bei mir leider als double definiert. (WARUM?)
double potenz ( double x, unsigned int n )
{
double erg = 1;
for ( ; n != 0; n >>= 1, x *= x )
{ if ( (n&1) == 1 ) erg *= x; }
return erg;
}
Das ist natürlich stark Compiler und System-abhängig.@Vereth:
Danke für die Erklärung, so ähnlich hatte ich es auch in Erinnerung.
Deine Variante braucht für den Test ca. 440 ms und ist damit ein kleines bisschen langsamer als pow(), und sie ist doppelt so schnell wie der vorgestellte Algorithmus (mit i ).
for(int j = 0; j<100000; j++){
for(int i = 0; i<1024; i++){
x = pow((double)2, i);
//x = potenz_dc(2, i);
}
}
pow: 10.8725s
potenz_iterativ: 5.1s
potenz_rekursiv: 4.4847s
pow: 14.211s
potenz_rekursiv: 5.9292s
potenz_iterativ: 5.547s
pow: 1,47 s
iteratov: 1,50 s
rekursiv: 1,32 s
Bei einer Messung mit so wenigen Iterationen kannst du clock() völlig vergessen. Du mußt schon zusehen das der Workload etwas größer ist, so das die Ungenauigkeit von clock() nicht so ins Gewicht fällt. Hast du außerdem darauf geachtet, das die Testschleife nicht "wegoptimiert" wird? Das sieht anhand der Daten nicht so aus... Oder wieviel Iterationen der äußeren Schleife hast du durchgeführt?Hi,
ich habe auf XP mit Visual Studio 2008 per clock() (von time.h) gemessen.
Ich habe es gerade auch einmal mi VS 2008 probiert. Es hatte mich nämlich stutzig gemacht wie du auf diese Werte gekommen bist, da pow(double, double) langsamer hätte sein sollen.Das war aber die Debug-Version. Daher kommt vermutlich der Unterschied.
Release:
template<class _Ty> inline
_Ty _Pow_int(_Ty _X, int _Y)
{unsigned int _N;
if (_Y >= 0)
_N = (unsigned int)_Y;
else
_N = (unsigned int)(-_Y);
for (_Ty _Z = _Ty(1); ; _X *= _X)
{if ((_N & 1) != 0)
_Z *= _X;
if ((_N >>= 1) == 0)
return (_Y < 0 ? _Ty(1) / _Z : _Z); }}
std::pow(double, int) 4.9863s
iterativ: 4.5632s
rekursiv: 9.6167