Several fixes
authorceriel <none@none>
Wed, 20 Mar 1991 11:30:35 +0000 (11:30 +0000)
committerceriel <none@none>
Wed, 20 Mar 1991 11:30:35 +0000 (11:30 +0000)
lang/pc/libpc/cvt.c
lang/pc/libpc/exp.c
lang/pc/libpc/log.c
lang/pc/libpc/opn.c
lang/pc/libpc/wrf.c

index e534920..d3c2116 100644 (file)
@@ -3,6 +3,9 @@
 
 #if __STDC__
 #include <float.h>
+#else
+#include <math.h>
+#define DBL_MAX        M_MAX_D
 #endif
 
 static char *cvt();
@@ -59,11 +62,9 @@ cvt(value, ndigit, decpt, sign, ecvtflag)
        }
 
        *decpt = 0;
-#if __STDC__
        if (value >= DBL_MAX) {
                value = DBL_MAX;
        }
-#endif
        if (value != 0.0) {
                register struct powers_of_10 *pp = &p10[0];
 
index 0c02278..be488fd 100644 (file)
@@ -16,8 +16,9 @@ extern        _trp();
 #include <pc_math.h>
 #define M_MIN_D        DBL_MIN
 #define M_MAX_D        DBL_MAX
-#define HUGE   HUGE_VAL
 #endif
+#undef HUGE
+#define HUGE   1e1000
 
 static double
 Ldexp(fl,exp)
@@ -77,7 +78,16 @@ _exp(x)
        int     negative = x < 0;
 
        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) {
@@ -88,8 +98,6 @@ _exp(x)
        }
        if (negative) x = -x;
 
-       /* ??? avoid underflow ??? */
-
        n = x * M_LOG2E + 0.5;  /* 1/ln(2) = log2(e), 0.5 added for rounding */
        xn = n;
        {
index efabbc6..d5ba0e4 100644 (file)
 
 #if __STDC__
 #include <pc_math.h>
-#define HUGE   HUGE_VAL
+#include <float.h>
 #endif
+#undef HUGE
+#define HUGE   1e1000
 
 double
 _log(x)
index 40aebee..5317364 100644 (file)
@@ -39,10 +39,11 @@ extern int          _unlink();
 extern long            _lseek();
 
 static int tmpfil() {
+       static char *namebuf[] = "/usr/tmp/plf.xxxxx";
        int i; char *p,*q;
 
        i = _getpid();
-       p = "/usr/tmp/plf.xxxxx";
+       p = namebuf;
        q = p + 13;
        do
                *q++ = (i & 07) + '0';
index c5b9b36..acc42d9 100644 (file)
@@ -26,10 +26,15 @@ extern char *_fcvt();
 
 #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        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; {
        char *p,*b; int s,d; char buf[BUFSIZE];