ba237a9d91
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
124 lines
2.1 KiB
C
Executable File
124 lines
2.1 KiB
C
Executable File
/* DEC *ConvDoubleToDecimalRound( x, f, nid)
|
|
*
|
|
* ARGUMENT
|
|
* DEC *x;
|
|
* double f;
|
|
* int nid;
|
|
*
|
|
* DESCRIPTION
|
|
* Converts a double to a DEC with implied decimal nid. Uses
|
|
* eTwoTo32 (2^32), eTwoTo63 (2^63), and ergGMPowersOfTenDouble
|
|
* (powers of ten), all global double variables.
|
|
*
|
|
* SIDE EFFECTS
|
|
* None.
|
|
*
|
|
* RETURNS
|
|
* The DEC if the conversion is successful, and GM_NULL otherwise.
|
|
*
|
|
* POSSIBLE ERROR CODES
|
|
*
|
|
* GM_NOMEMORY
|
|
* GM_CNVRE
|
|
* GM_INVALIDID
|
|
*
|
|
* AUTHOR
|
|
* Jared Levy Feb. 9, 1987
|
|
* Copyright (C) 1987-1990 Greenleaf Software Inc. All rights reserved.
|
|
*
|
|
* MODIFICATIONS
|
|
*
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "gm.h"
|
|
#include "gmsystem.h"
|
|
|
|
DEC *ConvDoubleToDecimalRound( x, f, nid)
|
|
DEC *x;
|
|
double f;
|
|
int nid;
|
|
|
|
{
|
|
mbool wfIsNeg=FALSE;
|
|
double g;
|
|
|
|
|
|
_MacStart(GM_DFTODR);
|
|
if ((nid > GM_MAXID) || (nid < GM_MINID)) {
|
|
_MacErr(GM_INVALIDID);
|
|
_MacRet(GM_NULL);
|
|
}
|
|
|
|
_MacOutVarD(x);
|
|
|
|
/* f = 0 */
|
|
if (f == 0.0) {
|
|
_MacDZero(x);
|
|
_MacRet(x);
|
|
}
|
|
|
|
/* take absolute value of negative values */
|
|
if (f<0.0) {
|
|
wfIsNeg = TRUE;
|
|
f = -f;
|
|
}
|
|
|
|
/* adjust by power of 10 */
|
|
if (nid > 0) {
|
|
f*= ergGMPowersOfTenDouble[nid];
|
|
}
|
|
|
|
_MacDZero(x);
|
|
|
|
/* overflow and underflow */
|
|
if ((f>=eTwoTo63) || (f<0.5)) {
|
|
_MacErr(GM_CNVRE);
|
|
_MacRet(GM_NULL);
|
|
}
|
|
|
|
/* add .5 to round rather than truncate */
|
|
f+= 0.5;
|
|
|
|
/* change float to 64 bit integer */
|
|
if (f >= eTwoTo32-1) {
|
|
#ifdef ZORTECH
|
|
if ( (f / eTwoTo32) > eTwoTo31 ) {
|
|
x->ls.lsl[1] = (unsigned long) ((f / eTwoTo32) - eTwoTo31 );
|
|
x->ls.lsl[1] += (unsigned long) eTwoTo31;
|
|
} else
|
|
x->ls.lsl[1] = (unsigned long) (f / eTwoTo32);
|
|
#else
|
|
x->ls.lsl[1] = (unsigned long) (f / eTwoTo32);
|
|
#endif
|
|
g = (double) x->ls.lsl[1];
|
|
if (g<0.0)
|
|
g+= eTwoTo32;
|
|
f = f - g * eTwoTo32;
|
|
while (f<0.0) {
|
|
x->ls.lsl[1]--;
|
|
f+= eTwoTo32;
|
|
}
|
|
while (f>= eTwoTo32) {
|
|
x->ls.lsl[1]++;
|
|
f-= eTwoTo32;
|
|
}
|
|
}
|
|
#ifdef ZORTECH
|
|
if ( f > eTwoTo31 ) {
|
|
x->ls.lsl[0] = f - eTwoTo31;
|
|
x->ls.lsl[0] += (unsigned long) eTwoTo31;
|
|
} else
|
|
x->ls.lsl[0] = (unsigned long) f;
|
|
#else
|
|
x->ls.lsl[0] = (unsigned long) f;
|
|
#endif
|
|
x->ls.lid = nid;
|
|
|
|
if (wfIsNeg)
|
|
_MacDChgs(x);
|
|
|
|
_MacRet(x);
|
|
}
|