79 lines
1.4 KiB
C
79 lines
1.4 KiB
C
|
/* 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 <stdio.h>
|
||
|
#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);
|
||
|
}
|