Gå til innhold

Anbefalte innlegg

Denne rekrusjonsmetoden viser seg å være raskere enn Math.pow, vertfall som jeg så.

 

   public static double pow2(int x, int n) {
       if (n == 0) return 1;
       else {
           if ((n % 2) > 0) return x * pow2(x * x, (n - 1) / 2);
           else return pow2(x * x, n / 2);
       }
   }

 

Eksempelsammenligning:

 

       long start = System.nanoTime();
       pow2(2, 4000);
       start = System.nanoTime() - start;
       System.out.println(start);
       start = System.nanoTime();
       Math.pow(2, 4000);
       start = System.nanoTime() - start;
       System.out.println(start);

 

(Viser seg å ta lengre tid å regne ut start inne i System.out.println)

 

 

...

 

Jeg fant ikke kode til Math.pow, netbeans ga obskurte svar.

Men kan det hende de bruker en tregere algoritme?

Eller er det pga initialisering?

Endret av LordEirik
Lenke til kommentar
Videoannonse
Annonse
Jeg fant ikke kode til Math.pow, netbeans ga obskurte svar.

Men kan det hende de bruker en tregere algoritme?

Eller er det pga initialisering?

9463760[/snapback]

Det er jo enkelt aa finne ut av, eller?

9464128[/snapback]

 

Siden pow2 er også static, slik som Math.pow skal vel det utlignes, muligens.

Jeg kjørte test fra main, så ingen objekter der pow2 er, ble initialisert.

uansett fant jeg ikke koden til Math.pow...

Lenke til kommentar

Det er nok så enkelt at metoden din regner ut feilt svar. Grunnen til dette er at du bruke int som input og da går det fort galt.

 

Bruker (2, 1000), 4000 gir "infinity".

Her er et eksempel hvor jeg også skriver ut resultatet i tillegg til tiden:

 

0.0

14536207

1.0715086071862673E301

1704179

 

Når jeg bruker double som input får jeg følgende:

1.0715086071862673E301

14935739

1.0715086071862673E301

799388

Lenke til kommentar
Det er nok så enkelt at metoden din regner ut feilt svar. Grunnen til dette er at du bruke int som input og da går det fort galt.

 

Bruker (2, 1000), 4000 gir "infinity".

Her er et eksempel hvor jeg også skriver ut resultatet i tillegg til tiden:

 

0.0

14536207

1.0715086071862673E301

1704179

 

Når jeg bruker double som input får jeg følgende:

1.0715086071862673E301

14935739

1.0715086071862673E301

799388

9468394[/snapback]

 

Jeg så ikke feilen før, takk :)

 

Byttet om til double og n = 1000.

Min metode er fortsatt raskere....

5000 mot 50 000!

(Skriver ikke ut svaret da System.out.println er hypertreig, sjekket svarene etterpå, like svar).

Lenke til kommentar

Jeg foeyde til noe til koden din:

     long start = System.nanoTime();
     pow2(2, 4000);
     start = System.nanoTime() - start;
     System.out.println(start);
     start = System.nanoTime();
     Math.pow(2, 4000);
     start = System.nanoTime() - start;
     System.out.println(start);
     start = System.nanoTime();
     Math.pow(2, 4000);
     start = System.nanoTime() - start;
     System.out.println(start);

 

..og fikk foelgende svar:

6425
15774072
3073

Hjemmeleksen for idag:

Hvorfor Math.pow ble mye, mye raskere andre gang?

Endret av Patton
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...