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:
Denne har været afprøvet i de samme omgivelser som den oprindelige funktion med samme resultat./* Iterative calculation of factorials. */ #include int fak( int n ) { int r; int i; r = 1; i=1; while ( i
En tilsvarende IJVM metode ser således ud:
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):.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
Følgende C-program viser, at værdiområdet for int er [ -2147483648, 2147483647]:return value: 24
Fakultetsfunktionen i C udgaven giver korrekte resultater op til n=12. For n= 13 fås et forkert resultat:/* Calculates max and min value of interger */ #include 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
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.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)