2000-02-18 03:39:52 +08:00
|
|
|
/*
|
|
|
|
* return (*acc) scaled by 10**dexp.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <_ansi.h>
|
|
|
|
#include <reent.h>
|
|
|
|
#include "std.h"
|
|
|
|
|
|
|
|
#define abs(x) (((x) < 0) ? -(x) : (x))
|
|
|
|
|
|
|
|
double
|
2017-12-04 11:43:30 +08:00
|
|
|
__adjust (struct _reent *ptr,
|
2017-12-04 09:31:41 +08:00
|
|
|
double *acc,
|
|
|
|
int dexp,
|
2000-02-18 03:39:52 +08:00
|
|
|
int sign)
|
|
|
|
/* *acc the 64 bit accumulator */
|
|
|
|
/* dexp decimal exponent */
|
|
|
|
/* sign sign flag */
|
|
|
|
{
|
|
|
|
double r;
|
|
|
|
|
|
|
|
if (dexp > MAXE)
|
|
|
|
{
|
2022-01-18 17:13:04 +08:00
|
|
|
_REENT_ERRNO(ptr) = ERANGE;
|
2000-02-18 03:39:52 +08:00
|
|
|
return (sign) ? -HUGE_VAL : HUGE_VAL;
|
|
|
|
}
|
|
|
|
else if (dexp < MINE)
|
|
|
|
{
|
2022-01-18 17:13:04 +08:00
|
|
|
_REENT_ERRNO(ptr) = ERANGE;
|
2000-02-18 03:39:52 +08:00
|
|
|
return 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
r = *acc;
|
|
|
|
if (sign)
|
|
|
|
r = -r;
|
|
|
|
if (dexp == 0)
|
|
|
|
return r;
|
|
|
|
|
|
|
|
if (dexp < 0)
|
|
|
|
return r / __exp10 (abs (dexp));
|
|
|
|
else
|
|
|
|
return r * __exp10 (dexp);
|
|
|
|
}
|