Annotation of coherent/d/lib/libc/crt/_pow10.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * C general utilities library internals.
                      3:  * _pow10()
                      4:  * Compute 10.0^n.
                      5:  * Assumes -319 <= DBL_MIN_10_EXP and DBL_MAX_10_EXP <= 319,
                      6:  * which is true for IEEE-format doubles.
                      7:  * Modified for MS-DOS from the standard ANSI library source.
                      8:  */
                      9: 
                     10: /*
                     11:  * There are lots of ways to do this, with varying accuracy, size, and speed.
                     12:  * This version is nonrecursive and fast but uses somewhat bulky tables.
                     13:  * It does the common cases -16 < exp < 16 by table lookup with no fp arithmetic.
                     14:  * It does 16 <= exp <= DBL_MAX_10_EXP with one fp multiply.
                     15:  * It does DBL_MIN_10_EXP <= exp <= -16 with one fp divide.
                     16:  */
                     17: 
                     18: #include <math.h>
                     19: 
                     20: #if    IEEE
                     21: #define        DBL_MAX_10_EXP  308
                     22: #define DBL_MIN_10_EXP -307
                     23: #else
                     24: #define        DBL_MAX_10_EXP  38
                     25: #define DBL_MIN_10_EXP -38
                     26: #endif
                     27: 
                     28: static const double powtab0[] = {
                     29:        1e0,    1e-1,   1e-2,   1e-3,   1e-4,   1e-5,   1e-6,   1e-7,
                     30:        1e-8,   1e-9,   1e-10,  1e-11,  1e-12,  1e-13,  1e-14,  1e-15
                     31: };
                     32: 
                     33: static const double powtab1[] = {
                     34:        1e0,    1e1,    1e2,    1e3,    1e4,    1e5,    1e6,    1e7,
                     35:        1e8,    1e9,    1e10,   1e11,   1e12,   1e13,   1e14,   1e15
                     36: };
                     37: 
                     38: static const double powtab2[] = {
                     39: #ifdef IEEE
                     40:        1e16,   1e32,   1e48,   1e64,   1e80,   1e96,   1e112,  1e128,
                     41:        1e144,  1e160,  1e176,  1e192,  1e208,  1e224,  1e240,  1e256,
                     42:        1e272,  1e288,  1e304
                     43: #else
                     44:        1e16,   1e32
                     45: #endif
                     46: };
                     47: 
                     48: double
                     49: _pow10(exp) register int exp;
                     50: {
                     51:        if (exp < 0) {
                     52:                if ((exp = -exp) < 16)
                     53:                        return powtab0[exp];
                     54:                else if (exp <= -DBL_MIN_10_EXP)
                     55:                        return powtab0[exp & 15] / powtab2[(exp >> 4) - 1];
                     56:                else
                     57:                        return 0.0;             /* exponent underflow */
                     58:        }
                     59:        else if (exp < 16)
                     60:                return powtab1[exp];
                     61:        else if (exp <= DBL_MAX_10_EXP)
                     62:                return powtab1[exp & 15] * powtab2[(exp >> 4) - 1];
                     63:        else
                     64:                return HUGE_VAL;                /* exponent overflow */
                     65: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.