Szorzás


A két argumentumaként kapott számot összeszorozza, és az eredményt egy dinamikusan allokált területen tárolva adja vissza. A program kódolása a sebesség optimalizálása miatt egy kicsit kevésbé olvasható, mint az kívánatos lenne egy oktató anyagban.
Number Multiply(Number a, Number b){
 register int i,j; /* indexeléshez */
 register Number result;
 register lNumber accumulator;
 register u32 cy;
 register u32 *q; /* olyan mutató, amely az index számításokat csökkenti */
 register u8 *p,*r;
 accumulator = NewlNumber(a->n+b->n); /* létrehozzuk az akkumulátort */
 if( !accumulator )return (Number)0;
 /* Kitöröljük az akkumulátor tartalmát */
 for( j=0 ; j n ; j++ )
 ACC(j) = (u32)0;
 p = a->digit;
A következő két egymásba ágyazott ciklusban minden digitet megszorzunk minden digittel, és a helyiértékek összegének megfelelő helyre tesszük.
 for( i=0 ; i n ; i++,p++ ){
 r = b->digit;q = accumulator->digit + i;
 for( j=0 ; j n ; j++ )
 *q++ += ((u32)*p)*((u32)*r++);
 /* Normalizáljuk az akkumulátor használt részét. */
 q = accumulator->digit;cy=0;
 for( j=0 ; j n || (jn+b->n && cy) ; j++,q++ ){
 *q += cy;
 cy = (*q)/POW2_8;
 *q &= (POW2_8-1);
 }
 if( cy ){
 ReportLog('I',"Internal error in multiply.");
 }
 }
 /* Kiszámítjuk az eredmény hosszát. */
 for( i=0,j=1 ; i n ; i++ )
 if( ACC(i) )j=i+1;
 result = NewNumber(j);
 if( !result ){
 DisposelNumber(accumulator);
 return (Number)0;
 }
 for( i=0 ; i digit[i] = (u8)ACC(i);
 DisposelNumber(accumulator);
 return result;
 }

toc