#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)
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) {
}
if (negative) x = -x;
- /* ??? avoid underflow ??? */
-
n = x * M_LOG2E + 0.5; /* 1/ln(2) = log2(e), 0.5 added for rounding */
xn = n;
{
#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];