Arkitektur og operativsystemer (dArkOS)


Besvarelse af ugeopgave, uge 40

Per Abrahamsen, 20001358, 3,
Mads Peter Lindberg, 20001990, 3,
Søren S. Munk, 2001614, 3.

www.daimi.au.dk/~smunk/dArkOS/uge40/


C-funktion fak er ændret, så der i stedet for en for-sætning benyttes en while-sætning. Resultatet er:

/* Iterative calculation of factorials. */ #include <stdio.h> int fak( int n ) { int r; int i; r = 1; i=1; while ( i<n ){ r = r*(i+1); i++;} return r; } int main() { printf("fak(4) = %d. \n", fak(4)); } kørsels udskrift: fak.c :fak(4) = 24. (originale) fak2.c :fak(4) = 24.(uden for-)
Denne har været afprøvet i de samme omgivelser som den oprindelige funktion med samme resultat.

En tilsvarende IJVM metode ser således ud:

.method fak .args 2 // ( int n ) .define n = 1 .define OBJREF = 42 .locals 2 // int r, int i; .define r = 2 .define i = 3 bipush 1 istore r // ( r = 1 ) bipush 1 istore i // ( i = 1 ) while: iload i iload n isub // ( i - n ) iflt do // if ( i < n ) goto end_while do: bipush OBJREF iload i bipush 1 iadd // ( i + 1 ) iload r invokevirtual imul // ( r * ( i + 1 ) ) istore r bipush 1 iload i iadd istore i // ( i++ ) goto while end_while: iload r ireturn
Et hovedprogram med eet argumenter er blevet udformet, så fak metoden kan afprøves. Der er foretaget en kørsel af hovedprogrammet med samme argument som blev anvendt ved kørsel af den rettede C funktion. Programmet gav (Kørslen er foretaget med option -s så kun resultatet af funktionskaldet kan ses):
return value: 24
Følgende C-program viser, at værdiområdet for int er [ -2147483648, 2147483647]:
/* Calculates max and min value of interger */ #include <stdio.h> int main() { int i; for ( i=1 ; i>0 ; i=i*2) {} printf("max %d, min %d \n",i-1,i); return 0; } Udskrift: max 2147483647, min -2147483648
Fakultetsfunktionen i C udgaven giver korrekte resultater op til n=12. For n= 13 fås et forkert resultat:
fak(2) = 2. fak(3) = 6. fak(4) = 24. fak(5) = 120. fak(6) = 720. fak(7) = 5040. fak(8) = 40320. fak(9) = 362880. fak(10) = 3628800. fak(11) = 39916800. fak(12) = 479001600. mindste værdi hvor det går galt (n = 13)
Fak(13) giver 6227037120 som ligger ud over max integer værdien, det løber så meget over at det bliver positivt igen og giver 1932053504 som umiddelbart ser ud til at være rigtigt nok, men det er det ik.
.