Return to BSD News archive
Xref: sserve comp.os.linux:30817 comp.os.386bsd.questions:957 Newsgroups: comp.os.linux,comp.os.386bsd.questions Path: sserve!newshost.anu.edu.au!munnari.oz.au!constellation!convex!convex!cs.utexas.edu!zaphod.mps.ohio-state.edu!usc!elroy.jpl.nasa.gov!ames!decwrl!netcomsv!netcom.com!hasty From: hasty@netcom.com (Amancio Hasty Jr) Subject: Re: 386bsd, linux: which runs more out of the box? Message-ID: <hastyC4CpLr.247@netcom.com> Organization: Netcom Online Communications Services (408-241-9760 login: guest) References: <1ome2o$1lu6@hal.gnu.ai.mit.edu> <1993Mar23.085058.13670@serval.net.wsu.edu> <CGD.93Mar23030821@erewhon.CS.Berkeley.EDU> Date: Tue, 23 Mar 1993 16:53:51 GMT Lines: 311 In article <CGD.93Mar23030821@erewhon.CS.Berkeley.EDU> cgd@erewhon.CS.Berkeley.EDU (Chris G. Demetriou) writes: >In article <1993Mar23.085058.13670@serval.net.wsu.edu> hlu@luke.eecs.wsu.edu (HJ Lu) writes: >>Linux can do POSIX, SYSV and most of BSD. > >however, consider this: > >for a while, the slogan went: "all the world's a vax (running BSD)". >then, it more or less became: "all the world's a sun (running a > BSD-derivative, if SunOS < 5.0)." > > >so 386bsd will do most of posix, and basically all of BSD stuff. > >and i think that, at this stage of the game, except for GNU software >(which tends to be fine-tuned per platform), you'll end up >being able to compile things just as, if not more easily >under 386bsd... > > >and i'm not sure the problems you had w/386bsd's strtod, but they >might be fixed now... (but i'm not a libc hacker, so... 8-) > > >chris >-- >Chris G. Demetriou cgd@cs.berkeley.edu > > MENTALLY CONTAMINATED and proud of it! Well, here is strtod.c which works tested with interviews, tk/tcl, P3D, rayshared-4.0, etc... Enjoy, Amancio =======================begin to hack now=========================== #include <stdlib.h> #include <stddef.h> #include <ctype.h> /* * strtod.c -- * * Source code for the "strtod" library procedure. * * Copyright 1988-1992 Regents of the University of California * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without * fee is hereby granted, provided that the above copyright * notice appear in all copies. The University of California * makes no representations about the suitability of this * software for any purpose. It is provided "as is" without * express or implied warranty. */ #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifndef NULL #define NULL 0 #endif static int maxExponent = 511; /* Largest possible base 10 exponent. Any * exponent larger than this will already * produce underflow or overflow, so there's * no need to worry about additional digits. */ static double powersOf10[] = { /* Table giving binary powers of 10. Entry */ 10., /* is 10^2^i. Used to convert decimal */ 100., /* exponents into floating-point numbers. */ 1.0e4, 1.0e8, 1.0e16, 1.0e32, 1.0e64, 1.0e128, 1.0e256 }; /* *---------------------------------------------------------------------- * * strtod -- * * This procedure converts a floating-point number from an ASCII * decimal representation to internal double-precision format. * * Results: * The return value is the double-precision floating-point * representation of the characters in string. If endPtr isn't * NULL, then *endPtr is filled in with the address of the * next character after the last one that was part of the * floating-point number. * * Side effects: * None. * *---------------------------------------------------------------------- */ double strtod(string, endPtr) const char *string; /* A decimal ASCII floating-point number, * optionally preceded by white space. * Must have form "-I.FE-X", where I is the * integer part of the mantissa, F is the * fractional part of the mantissa, and X * is the exponent. Either of the signs * may be "+", "-", or omitted. Either I * or F may be omitted, or both. The decimal * point isn't necessary unless F is present. * The "E" may actually be an "e". E and X * may both be omitted (but not just one). */ char **endPtr; /* If non-NULL, store terminating character's * address here. */ { int sign, expSign = FALSE; double fraction, dblExp, *d; double tmp1, tmp2; char *p, c; int exp = 0; /* Exponent read from "EX" field. */ int fracExp = 0; /* Exponent that derives from the fractional * part. Under normal circumstatnces, it is * the negative of the number of digits in F. * However, if I is very long, the last digits * of I get dropped (otherwise a long I with a * large negative exponent could cause an * unnecessary overflow on I alone). In this * case, fracExp is incremented one for each * dropped digit. */ int mantSize; /* Number of digits in mantissa. */ int decPt; /* Number of mantissa digits BEFORE decimal * point. */ char *pExp; /* Temporarily holds location of exponent * in string. */ /* * Strip off leading blanks and check for a sign. */ p = string; while (isspace(*p)) { p += 1; } if (*p == '-') { sign = TRUE; p += 1; } else { if (*p == '+') { p += 1; } sign = FALSE; } /* * Count the number of digits in the mantissa (including the decimal * point), and also locate the decimal point. */ decPt = -1; for (mantSize = 0; ; mantSize += 1) { c = *p; if (!isdigit(c)) { if ((c != '.') || (decPt >= 0)) { break; } decPt = mantSize; } p += 1; } /* * Now suck up the digits in the mantissa. Use two integers to * collect 9 digits each (this is faster than using floating-point). * If the mantissa has more than 18 digits, ignore the extras, since * they can't affect the value anyway. */ pExp = p; p -= mantSize; if (decPt < 0) { decPt = mantSize; } else { mantSize -= 1; /* One of the digits was the point. */ } if (mantSize > 18) { fracExp = decPt - 18; mantSize = 18; } else { fracExp = decPt - mantSize; } if (mantSize == 0) { fraction = 0.0; p = string; goto done; } else { int frac1, frac2; frac1 = 0; for ( ; mantSize > 9; mantSize -= 1) { c = *p; p += 1; if (c == '.') { c = *p; p += 1; } frac1 = 10*frac1 + (c - '0'); } frac2 = 0; for (; mantSize > 0; mantSize -= 1) { c = *p; p += 1; if (c == '.') { c = *p; p += 1; } frac2 = 10*frac2 + (c - '0'); } tmp1 = frac1; tmp2 = frac2; /* fraction = (1.0e9 * frac1) + frac2; */ fraction = (1.0e9 * tmp1) + tmp2; } /* * Skim off the exponent. */ p = pExp; if ((*p == 'E') || (*p == 'e')) { p += 1; if (*p == '-') { expSign = TRUE; p += 1; } else { if (*p == '+') { p += 1; } expSign = FALSE; } while (isdigit(*p)) { exp = exp * 10 + (*p - '0'); p += 1; } } if (expSign) { exp = fracExp - exp; } else { exp = fracExp + exp; } /* * Generate a floating-point number that represents the exponent. * Do this by processing the exponent one bit at a time to combine * many powers of 2 of 10. Then combine the exponent with the * fraction. */ if (exp < 0) { expSign = TRUE; exp = -exp; } else { expSign = FALSE; } if (exp > maxExponent) { exp = maxExponent; } dblExp = 1.0; for (d = powersOf10; exp != 0; exp >>= 1, d += 1) { if (exp & 01) { dblExp *= *d; } } if (expSign) { fraction /= dblExp; } else { fraction *= dblExp; } done: if (endPtr != NULL) { *endPtr = p; } if (sign) { return (-1.00 * fraction); } return fraction; } double atof(ascii) const char *ascii; { return(strtod(ascii, (char **)NULL)); } -- This message brought to you by the letters X and S and the number 3 Amancio Hasty | Home: (415) 495-3046 | ftp-site depository of all my work: e-mail hasty@netcom.com | sunvis.rtpnc.epa.gov:/pub/386bsd/incoming