Annotation of 43BSDTahoe/new/B/src/bint/mkconfig.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: 
        !             3: /*
        !             4:   $Header: mkconfig.c,v 1.4 85/08/26 10:41:39 timo Exp $
        !             5: */
        !             6: 
        !             7: /* Generate constants for configuration file                   */
        !             8: 
        !             9: /* If your C system is not unix but does have signal/setjmp,   */
        !            10: /*    add a #define unix                                       */
        !            11: /* You may also need to add some calls to signal().            */
        !            12: 
        !            13: #ifdef unix
        !            14: 
        !            15: #define SIGNAL
        !            16: 
        !            17: #include <signal.h>
        !            18: #include <setjmp.h>
        !            19: 
        !            20:        jmp_buf lab;
        !            21:        overflow(sig) int sig; { /* what to do on overflow/underflow */
        !            22:                signal(sig, overflow);
        !            23:                longjmp(lab, 1);
        !            24:        }
        !            25: 
        !            26: #else
        !            27:        /* Dummy routines instead */
        !            28:        int lab=1;
        !            29:        int setjmp(lab) int lab; { return(0); }
        !            30: 
        !            31: #endif
        !            32: 
        !            33: #define fabs(x) (((x)<0.0)?(-x):(x))
        !            34: #define min(x,y) (((x)<(y))?(x):(y))
        !            35: 
        !            36: /* These routines are intended to defeat any attempt at optimisation */
        !            37: Dstore(a, b) double a, *b; { *b=a; }
        !            38: double Dsum(a, b) double a, b; { double r; Dstore(a+b, &r); return (r); }
        !            39: double Ddiff(a, b) double a, b; { double r; Dstore(a-b, &r); return (r); }
        !            40: double Dmul(a, b) double a, b; { double r; Dstore(a*b, &r); return (r); }
        !            41: double Ddiv(a, b) double a, b; { double r; Dstore(a/b, &r); return (r); }
        !            42: 
        !            43: double power(x, n) int x, n; {
        !            44:        double r=1.0;
        !            45:        for (;n>0; n--) r*=x;
        !            46:        return r;
        !            47: }
        !            48: 
        !            49: int log(base, x) int base; double x; {
        !            50:        int r=0;
        !            51:        while (x>=base) { r++; x/=base; }
        !            52:        return r;
        !            53: }
        !            54: 
        !            55: main(argc, argv) int argc; char *argv[]; {
        !            56:        char c;
        !            57:        short newshort, maxshort, maxershort;
        !            58:        int newint, maxint, shortbits, bits, mantbits,
        !            59:            *p, shortpower, intpower, longpower;
        !            60:        long newlong, maxlong, count;
        !            61: 
        !            62:        int i, ibase, iexp, irnd, imant, iz, k, machep, maxexp, minexp,
        !            63:            mx, negeps, ngrd, normalised;
        !            64:        double a, b, base, basein, basem1, eps, epsneg, xmax, newxmax,
        !            65:               xmin, xminner, y, y1, z, z1, z2;
        !            66: 
        !            67:        double BIG, Maxreal;
        !            68:        int BASE, MAXNUMDIG, ipower, tenlogBASE, Maxexpo, Minexpo, Dblbits;
        !            69: 
        !            70: #ifdef SIGNAL
        !            71:        signal(SIGFPE, overflow);
        !            72:        if (setjmp(lab)!=0) { printf("Unexpected over/underflow\n"); exit(1); }
        !            73: #endif
        !            74: 
        !            75: /****** Calculate max short *********************************************/
        !            76: /*      Calculate 2**n-1 until overflow - then use the previous value  */
        !            77: 
        !            78:        newshort=1; maxshort=0;
        !            79: 
        !            80:        if (setjmp(lab)==0)
        !            81:                for(shortpower=0; newshort>maxshort; shortpower++) {
        !            82:                        maxshort=newshort;
        !            83:                        newshort=newshort*2+1;
        !            84:                }
        !            85: 
        !            86:        /* Now for those daft Cybers: */
        !            87: 
        !            88:        maxershort=0; newshort=maxshort;
        !            89: 
        !            90:        if (setjmp(lab)==0)
        !            91:                for(shortbits=shortpower; newshort>maxershort; shortbits++) {
        !            92:                        maxershort=newshort;
        !            93:                        newshort=newshort+newshort+1;
        !            94:                }
        !            95: 
        !            96:        bits= (shortbits+1)/sizeof(short);
        !            97:        c= (char)(-1);
        !            98:        printf("/\* char=%d bits, %ssigned *\/\n", sizeof(c)*bits,
        !            99:                        ((int)c)<0?"":"un");
        !           100:        printf("/\* maxshort=%d (=2**%d-1) *\/\n", maxshort, shortpower);
        !           101: 
        !           102:        if (maxershort>maxshort) {
        !           103:                printf("/\* There is a larger maxshort, %d (=2**%d-1), %s *\/\n",
        !           104:                        maxershort, shortbits, 
        !           105:                        "but only for addition, not multiplication");
        !           106:        }
        !           107: 
        !           108: /****** Calculate max int by the same method ***************************/
        !           109: 
        !           110:        newint=1; maxint=0;
        !           111: 
        !           112:        if (setjmp(lab)==0)
        !           113:                for(intpower=0; newint>maxint; intpower++) {
        !           114:                        maxint=newint;
        !           115:                        newint=newint*2+1;
        !           116:                }
        !           117: 
        !           118:        printf("/\* maxint=%d (=2**%d-1) *\/\n", maxint, intpower);
        !           119: 
        !           120: /****** Calculate max long by the same method ***************************/
        !           121: 
        !           122:        newlong=1; maxlong=0;
        !           123: 
        !           124:        if (setjmp(lab)==0)
        !           125:                for(longpower=0; newlong>maxlong; longpower++) {
        !           126:                        maxlong=newlong;
        !           127:                        newlong=newlong*2+1;
        !           128:                }
        !           129: 
        !           130:        if (setjmp(lab)!=0) { printf("\nUnexpected under/overflow\n"); exit(1); }
        !           131: 
        !           132:        printf("/\* maxlong=%ld (=2**%d-1) *\/\n", maxlong, longpower);
        !           133: 
        !           134: /****** Pointers ********************************************************/
        !           135:        printf("/\* pointers=%d bits%s *\/\n", sizeof(p)*bits,
        !           136:                sizeof(p)>sizeof(int)?" BEWARE! larger than int!":"");
        !           137: 
        !           138: /****** Base and size of mantissa ***************************************/
        !           139:        a=1.0;
        !           140:        do { a=Dsum(a, a); } while (Ddiff(Ddiff(Dsum(a, 1.0), a), 1.0) == 0.0);
        !           141:        b=1.0;
        !           142:        do { b=Dsum(b, b); } while ((base=Ddiff(Dsum(a, b), a)) == 0.0);
        !           143:        ibase=base;
        !           144:        printf("/\* base=%d *\/\n", ibase);
        !           145: 
        !           146:        imant=0; b=1.0;
        !           147:        do { imant++; b=Dmul(b, base); }
        !           148:        while (Ddiff(Ddiff(Dsum(b,1.0),b),1.0) == 0.0);
        !           149:        printf("/\* Significant base digits=%d *\/\n", imant);
        !           150: 
        !           151: /****** Various flavours of epsilon *************************************/
        !           152:        basem1=Ddiff(base,1.0);
        !           153:        if (Ddiff(Dsum(a, basem1), a) != 0.0) irnd=1; 
        !           154:        else irnd=0;
        !           155: 
        !           156:        negeps=imant+imant;
        !           157:        basein=1.0/base;
        !           158:        a=1.0;
        !           159:        for(i=1; i<=negeps; i++) a*=basein;
        !           160: 
        !           161:        b=a;
        !           162:        while (Ddiff(Ddiff(1.0, a), 1.0) == 0.0) {
        !           163:                a*=base;
        !           164:                negeps--;
        !           165:        }
        !           166:        negeps= -negeps;
        !           167:        printf("/\* Smallest x such that 1.0-base**x != 1.0=%d *\/\n", negeps);
        !           168: 
        !           169:        epsneg=a;
        !           170:        if ((ibase!=2) && (irnd==1)) {
        !           171:        /*      a=(a*(1.0+a))/(1.0+1.0); => */
        !           172:                a=Ddiv(Dmul(a, Dsum(1.0, a)), Dsum(1.0, 1.0));
        !           173:        /*      if ((1.0-a)-1.0 != 0.0) epsneg=a; => */
        !           174:                if (Ddiff(Ddiff(1.0, a), 1.0) != 0.0) epsneg=a;
        !           175:        }
        !           176:        printf("/\* Small x such that 1.0-x != 1.0=%g *\/\n", epsneg);
        !           177:        /* it may not be the smallest */
        !           178: 
        !           179:        machep= -imant-imant;
        !           180:        a=b;
        !           181:        while (Ddiff(Dsum(1.0, a), 1.0) == 0.0) { a*=base; machep++; }
        !           182:        printf("/\* Smallest x such that 1.0+base**x != 1.0=%d *\/\n", machep);
        !           183: 
        !           184:        eps=a;
        !           185:        if ((ibase!=2) && (irnd==1)) {
        !           186:        /*      a=(a*(1.0+a))/(1.0+1.0); => */
        !           187:                a=Ddiv(Dmul(a, Dsum(1.0, a)), Dsum(1.0, 1.0));
        !           188:        /*      if ((1.0+a)-1.0 != 0.0) eps=a; => */
        !           189:                if (Ddiff(Dsum(1.0, a), 1.0) != 0.0) eps=a;
        !           190:        }
        !           191:        printf("/\* Smallest x such that 1.0+x != 1.0=%g *\/\n", eps);
        !           192: 
        !           193: /****** Round or chop ***************************************************/
        !           194:        ngrd=0;
        !           195:        if (irnd == 1) { printf("/\* Arithmetic rounds *\/\n"); }
        !           196:        else { 
        !           197:                printf("/\* Arithmetic chops");
        !           198:                if (Ddiff(Dmul(Dsum(1.0,eps),1.0),1.0) != 0.0) {
        !           199:                        ngrd=1;
        !           200:                        printf(" but uses guard digits");
        !           201:                }
        !           202:                printf(" *\/\n");
        !           203:        }
        !           204: 
        !           205: /****** Size of and minimum normalised exponent ****************************/
        !           206:        y=0; i=0; k=1; z=basein; z1=(1.0+eps)/base;
        !           207: 
        !           208:        /* Coarse search for the largest power of two */
        !           209:        if (setjmp(lab)==0) /* in case of underflow trap */
        !           210:                do {
        !           211:                        y=z; y1=z1;
        !           212:                        z=Dmul(y,y); z1=Dmul(z1, y);
        !           213:                        a=Dmul(z,1.0);
        !           214:                        z2=Ddiv(z1,y);
        !           215:                        if (z2 != y1) break;
        !           216:                        if ((Dsum(a,a) == 0.0) || (fabs(z) >= y)) break;
        !           217:                        i++;
        !           218:                        k+=k;
        !           219:                } while(1);
        !           220: 
        !           221:        if (ibase != 10) {
        !           222:                iexp=i+1; /* for the sign */
        !           223:                mx=k+k;
        !           224:        } else {
        !           225:                iexp=2;
        !           226:                iz=ibase;
        !           227:                while (k >= iz) { iz*=ibase; iexp++; }
        !           228:                mx=iz+iz-1;
        !           229:        }
        !           230: 
        !           231:        /* Fine tune starting with y and y1 */
        !           232:        if (setjmp(lab)==0) /* in case of underflow trap */
        !           233:                do {
        !           234:                        xmin=y; z1=y1;
        !           235:                        y=Ddiv(y,base); y1=Ddiv(y1,base);
        !           236:                        a=Dmul(y,1.0);
        !           237:                        z2=Dmul(y1,base);
        !           238:                        if (z2 != z1) break;
        !           239:                        if ((Dsum(a,a) == 0.0) || (fabs(y) >= xmin)) break;
        !           240:                        k++;
        !           241:                } while (1);
        !           242: 
        !           243:        if (setjmp(lab)!=0) { printf("Unexpected over/underflow\n"); exit(1); }
        !           244: 
        !           245:        minexp= (-k)+1;
        !           246: 
        !           247:        if ((mx <= k+k-3) && (ibase != 10)) { mx+=mx; iexp+=1; }
        !           248:        printf("/\* Number of bits used for exponent=%d *\/\n", iexp);
        !           249:        printf("/\* Minimum normalised exponent=%d *\/\n", minexp);
        !           250:        printf("/\* Minimum normalised positive number=%g *\/\n", xmin);
        !           251: 
        !           252: /****** Minimum exponent ***************************************************/
        !           253:        if (setjmp(lab)==0) /* in case of underflow trap */
        !           254:                do {
        !           255:                        xminner=y;
        !           256:                        y=Ddiv(y,base);
        !           257:                        a=Dmul(y,1.0);
        !           258:                        if ((Dsum(a,a) == 0.0) || (fabs(y) >= xminner)) break;
        !           259:                } while (1);
        !           260: 
        !           261:        if (setjmp(lab)!=0) { printf("Unexpected over/underflow\n"); exit(1); }
        !           262: 
        !           263:        normalised=1;
        !           264:        if (xminner != 0.0 && xminner != xmin) {
        !           265:                normalised=0;
        !           266:                printf("/\* The smallest numbers are not kept normalised *\/\n");
        !           267:                printf("/\* Smallest unnormalised positive number=%g *\/\n",
        !           268:                        xminner);
        !           269:        }
        !           270: 
        !           271: /****** Maximum exponent ***************************************************/
        !           272:        maxexp=2; xmax=1.0; newxmax=base+1.0;
        !           273:        if (setjmp(lab) == 0) {
        !           274:                while (xmax<newxmax) {
        !           275:                        xmax=newxmax;
        !           276:                        newxmax=Dmul(newxmax, base);
        !           277:                        if (Ddiv(newxmax, base) != xmax) break; /* ieee infinity */
        !           278:                        maxexp++;
        !           279:                }
        !           280:        }
        !           281:        if (setjmp(lab)!=0) { printf("Unexpected over/underflow\n"); exit(1); }
        !           282: 
        !           283:        printf("/\* Maximum exponent=%d *\/\n", maxexp);
        !           284: 
        !           285: /****** Largest and smallest numbers ************************************/
        !           286:        xmax=Ddiff(1.0, epsneg);
        !           287:        if (Dmul(xmax,1.0) != xmax) xmax=Ddiff(1.0, Dmul(base,epsneg));
        !           288:        for (i=1; i<=maxexp; i++) xmax=Dmul(xmax, base);
        !           289:        printf("/\* Maximum number=%g *\/\n", xmax);
        !           290: 
        !           291: /****** Hidden bit + sanity check ***************************************/
        !           292:        if (ibase != 10) {
        !           293:                mantbits=log(2, (double)ibase)*imant;
        !           294:                if (mantbits+iexp+1 == sizeof(double)*bits+1) {
        !           295:                        printf("/\* Double arithmetic uses a hidden bit *\/\n");
        !           296:                } else if (mantbits+iexp+1 == sizeof(double)*bits) {
        !           297:                        printf("/\* Double arithmetic doesn't use a hidden bit *\/\n");
        !           298:                } else {
        !           299:                        printf("/\* Something fishy here! %s %s *\/\n",
        !           300:                                "Exponent size + mantissa size doesn't match",
        !           301:                                "with the size of a double.");
        !           302:                }
        !           303:        }
        !           304: 
        !           305: /****** The point of it all: ********************************************/
        !           306:        printf("\n/\* Numeric package constants *\/\n");
        !           307: 
        !           308:        BIG= power(ibase, imant)-1.0;
        !           309:        MAXNUMDIG= log(10, BIG);
        !           310:        ipower= log(10, (double)(maxint/2));
        !           311:        Maxreal= xmax;
        !           312:        Maxexpo= log(2, (double)ibase)*maxexp;
        !           313:        Minexpo= log(2, (double)ibase)*minexp;
        !           314:        Dblbits= log(2, (double)ibase)*imant;
        !           315:        tenlogBASE= min(MAXNUMDIG/2, ipower);
        !           316:        BASE=1; for(i=1; i<=tenlogBASE; i++) BASE*=10;
        !           317: 
        !           318:        printf("#define BIG %1.1f /\* Maximum integral double *\/\n", BIG);
        !           319:        printf("#define LONG ");
        !           320:                for(i=1; i<=MAXNUMDIG; i++) printf("9");
        !           321:                printf(".5 /\* Maximum power of ten less than BIG *\/\n");
        !           322:        printf("#define MAXNUMDIG %d /\* The number of 9's in LONG *\/\n",
        !           323:                MAXNUMDIG);
        !           324:        printf("#define MINNUMDIG 6 /\* Don't change: this is here for consistency *\/\n");
        !           325: 
        !           326:        printf("#define BASE %d /\* %s *\/\n",
        !           327:                BASE, "BASE**2<=BIG && BASE*2<=Maxint && -2*BASE>=Minint");
        !           328:        if (((double)BASE)*BASE > BIG || ((double)BASE)+BASE > maxint) {
        !           329:                printf("*** BASE value wrong\n");
        !           330:                exit(1);
        !           331:        }
        !           332:        printf("#define tenlogBASE %d /\*  = log10(BASE) *\/\n", tenlogBASE);
        !           333:        printf("#define Maxreal %e /\* Maximum double *\/\n", Maxreal);
        !           334:        printf("#define Maxexpo %d /\* Maximum value such that 2**Maxexpo<=Maxreal *\/\n",
        !           335:                Maxexpo);
        !           336:        printf("#define Minexpo (%d) /\* Minimum value such that -2**Minexpo>=Minreal *\/\n",
        !           337:                Minexpo);
        !           338:        printf("#define Dblbits %d /\* Maximum value such that 2**Dblbits<=BIG *\/\n",
        !           339:                Dblbits);
        !           340: 
        !           341:        printf("#define Maxintlet %d /\* Maximum short *\/\n", maxshort);
        !           342:        printf("#define Maxint %d /\* Maximum int *\/\n", maxint);
        !           343: 
        !           344:        printf("#define Maxsmallint %d /\* BASE-1 *\/\n", BASE-1);
        !           345:        printf("#define Minsmallint (%d) /\* -BASE *\/\n", -BASE);
        !           346: 
        !           347: /* An extra goody: the approximate amount of data-space */
        !           348: /* Put here because it is likely to be slower then the rest */
        !           349: 
        !           350:        /*Allocate blocks of 1000 until no more available*/
        !           351:        /*Don't be tempted to change this to 1024: */
        !           352:        /*we don't know how much header information there is*/
        !           353: 
        !           354:        for(count=0; (p=(int *)malloc(1000))!=0; count++) { }
        !           355: 
        !           356:        printf("\n/\* Memory~= %d000 *\/\n", count);
        !           357: 
        !           358:        exit(0);
        !           359: }

unix.superglobalmegacorp.com

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