/* int _Sq5UnsTo4Uns(pta); * * ARGUMENT * DEC *pta; * * DESCRIPTION * This routine modifies the representation of a DEC to have an * approximately equivalent value with an id <= MAXID and the mantissa * reduced to 64 bits, if that is possible. The new DEC is stored in * same place as the old DEC. Often this routine has no effect. * * SIDE EFFECTS * pta is modified. * * RETURNS * GM_SUCCESS if the adjustment to 64 bits is possible, and * GM_OVERFLOW if it is not. * * AUTHOR * Jared Levy 5/28/87 * Copyright (C) 1987-1990 Greenleaf Software Inc. All rights reserved. * * MODIFICATIONS * */ #include #include "gm.h" #include "gmsystem.h" int _Sq5UnsTo4Uns(pta) DEC *pta; { SHORT p=0, i; unsigned SHORT r=0; unsigned SHORT *a; a = pta->dc.sl; i = pta->dc.id; if (i>GM_MAXID) { _DivUnsArrByPwrOf10(a, 5, i - GM_MAXID); i = GM_MAXID; } if ((a[4] > 0) || (a[3] > 32767)) { if (a[4] >= 500) { r = _DivUnsArrByUns(a, 10000, 5); p+=4; } if (a[4] >= 50) { _DivUnsArrByUnsRound(a, 1000, 5); p+=3; } else if (a[4] >= 5) { _DivUnsArrByUnsRound(a, 100, 5); p+=2; } else if ((a[4] > 0) || (a[3] > 32767)) { _DivUnsArrByUnsRound(a, 10, 5); p++; } else if (r >= 5000) (void) _IncrementUnsArr(a); } pta->dc.id = i-p; if (i - p < GM_MINID) return(GM_OVERFLOW); return(GM_SUCCESS); }