campo-sirio/gfm/sq5to4.c

79 lines
1.4 KiB
C
Raw Normal View History

/* 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);
}