/*int _DivProcRnd(c,a,b,ida,idb,nid) * * ARGUMENT * DEC *c; * unsigned a[], b[]; * int ida,idb,nid; * * DESCRIPTION * This routine divides one positive DEC structure by another, setting * dst = src1 / src2. * * SIDE EFFECTS * None. * * RETURNS * GM_SUCCESS or error code. * * ALGORITHM * a = an * 10^-ad * b = bn * 10^-bd * c = a / b * c = (10^p * an / bn) * 10^[-(ad - bd + p)] * cn = 10^p * an / bn, cd = ad - bd + p * * AUTHOR * Jared Levy 05-JAN-1987 17:30 * Copyright (C) 1987-1990 Greenleaf Software Inc. All rights reserved. * * MODIFICATIONS * */ #include #include "gm.h" #include "gmsystem.h" int _DivProcRnd(c,a,b,ida,idb,nid) DEC *c; unsigned SHORT a[], b[]; int ida,idb,nid; { int i, p; unsigned SHORT *cn, ad[5]; /* sets c = a / b, where a and b are positive DEC numbers, and the result is stored in c */ cn = c->dc.sl; p = nid - (ida - idb); a[5] = 0; a[6] = 0; a[7] = 0; a[8] = 0; a[9] = 0; a[10]= 0; a[11]= 0; if (p<0) _DivUnsArrByPwrOf10(a,5,-p); if (p>0) { i = _MulUnsArrByPwrOf10(a,p,10); /* check for overflow */ ad[0]=a[5]; ad[1]=a[6]; ad[2]=a[7]; ad[3]=a[8]; ad[4]=a[9]; _DoubleUnsArr(ad, 5); if (a[4]&0x8000) ad[0]=ad[0]+1; if (!((i == GM_SUCCESS) && (_CompareUnsArr(ad,b,5) == -1))) return(GM_OVERFLOW); } _DivUns10ArrByUns5Arr(cn, a, b); c->dc.id = nid; return(GM_SUCCESS); }