LordEirik Skrevet 10. september 2007 Del Skrevet 10. september 2007 (endret) 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 10. september 2007 av LordEirik Lenke til kommentar
Patton Skrevet 10. september 2007 Del Skrevet 10. september 2007 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? Lenke til kommentar
LordEirik Skrevet 10. september 2007 Forfatter Del Skrevet 10. september 2007 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
mar Skrevet 10. september 2007 Del Skrevet 10. september 2007 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
LordEirik Skrevet 10. september 2007 Forfatter Del Skrevet 10. september 2007 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
Patton Skrevet 11. september 2007 Del Skrevet 11. september 2007 (endret) 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 11. september 2007 av Patton Lenke til kommentar
Ueland Skrevet 11. september 2007 Del Skrevet 11. september 2007 Skal du teste noen metoder så kjør de noen titusenganger for å få et litt realt grunnlag. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå