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 ; in ; 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 || (j n+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; }