campo-sirio/gfm/sq5to4.c
alex ba237a9d91 Patch level : no patch
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Aggiunti i sorgenti per Greenleaf Math Library (gfm.dll)


git-svn-id: svn://10.65.10.50/trunk@10079 c028cbd2-c16b-5b4b-a496-9718f37d4682
2002-02-26 12:19:02 +00:00

79 lines
1.4 KiB
C
Executable File

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