Several fixes

This commit is contained in:
ceriel 1991-03-20 11:30:35 +00:00
parent 7e8422d810
commit d32109c18d
5 changed files with 27 additions and 10 deletions

View file

@ -3,6 +3,9 @@
#if __STDC__ #if __STDC__
#include <float.h> #include <float.h>
#else
#include <math.h>
#define DBL_MAX M_MAX_D
#endif #endif
static char *cvt(); static char *cvt();
@ -59,11 +62,9 @@ cvt(value, ndigit, decpt, sign, ecvtflag)
} }
*decpt = 0; *decpt = 0;
#if __STDC__
if (value >= DBL_MAX) { if (value >= DBL_MAX) {
value = DBL_MAX; value = DBL_MAX;
} }
#endif
if (value != 0.0) { if (value != 0.0) {
register struct powers_of_10 *pp = &p10[0]; register struct powers_of_10 *pp = &p10[0];

View file

@ -16,8 +16,9 @@ extern _trp();
#include <pc_math.h> #include <pc_math.h>
#define M_MIN_D DBL_MIN #define M_MIN_D DBL_MIN
#define M_MAX_D DBL_MAX #define M_MAX_D DBL_MAX
#define HUGE HUGE_VAL
#endif #endif
#undef HUGE
#define HUGE 1e1000
static double static double
Ldexp(fl,exp) Ldexp(fl,exp)
@ -77,7 +78,16 @@ _exp(x)
int negative = x < 0; int negative = x < 0;
if (x <= M_LN_MIN_D) { if (x <= M_LN_MIN_D) {
return M_MIN_D; g = M_MIN_D/4.0;
if (g != 0.0) {
/* unnormalized numbers apparently exist */
if (x < (M_LN2 * (DBL_MIN_EXP - 53))) return 0.0;
}
else {
if (x < M_LN_MIN_D) return 0.0;
return M_MIN_D;
}
} }
if (x >= M_LN_MAX_D) { if (x >= M_LN_MAX_D) {
if (x > M_LN_MAX_D) { if (x > M_LN_MAX_D) {
@ -88,8 +98,6 @@ _exp(x)
} }
if (negative) x = -x; if (negative) x = -x;
/* ??? avoid underflow ??? */
n = x * M_LOG2E + 0.5; /* 1/ln(2) = log2(e), 0.5 added for rounding */ n = x * M_LOG2E + 0.5; /* 1/ln(2) = log2(e), 0.5 added for rounding */
xn = n; xn = n;
{ {

View file

@ -13,8 +13,10 @@
#if __STDC__ #if __STDC__
#include <pc_math.h> #include <pc_math.h>
#define HUGE HUGE_VAL #include <float.h>
#endif #endif
#undef HUGE
#define HUGE 1e1000
double double
_log(x) _log(x)

View file

@ -39,10 +39,11 @@ extern int _unlink();
extern long _lseek(); extern long _lseek();
static int tmpfil() { static int tmpfil() {
static char *namebuf[] = "/usr/tmp/plf.xxxxx";
int i; char *p,*q; int i; char *p,*q;
i = _getpid(); i = _getpid();
p = "/usr/tmp/plf.xxxxx"; p = namebuf;
q = p + 13; q = p + 13;
do do
*q++ = (i & 07) + '0'; *q++ = (i & 07) + '0';

View file

@ -26,10 +26,15 @@ extern char *_fcvt();
#define assert(x) /* nothing */ #define assert(x) /* nothing */
#define HUGE_DIG 39 /* log10(maxreal) */ #if __STDC__
#include <float.h>
#define HUGE_DIG DBL_MAX_10_EXP /* log10(maxreal) */
#else
#define HUGE_DIG 400 /* log10(maxreal) */
#endif
#define PREC_DIG 80 /* the maximum digits returned by _fcvt() */ #define PREC_DIG 80 /* the maximum digits returned by _fcvt() */
#define FILL_CHAR '0' /* char printed if all of _fcvt() used */ #define FILL_CHAR '0' /* char printed if all of _fcvt() used */
#define BUFSIZE HUGE_DIG + PREC_DIG + 2 #define BUFSIZE HUGE_DIG + PREC_DIG + 3
_wrf(n,w,r,f) int n,w; double r; struct file *f; { _wrf(n,w,r,f) int n,w; double r; struct file *f; {
char *p,*b; int s,d; char buf[BUFSIZE]; char *p,*b; int s,d; char buf[BUFSIZE];