Annotation of researchv10no/cmd/lfactor/mult.c, revision 1.1.1.1

1.1       root        1: #include "mp.h"
                      2: 
                      3: mint
                      4: mult(a,b)
                      5: mint a, b;
                      6: {
                      7:        mint z;
                      8:        mint c;
                      9:        mint mtemp;
                     10:        int sign;
                     11:        double a3, a2, a1, a0;
                     12:        double b1, b0;
                     13:        double temp1, temp2;
                     14: 
                     15:        if((a.high==0) && (b.high==0)){
                     16:                c.high = 0.;
                     17:                c.low = a.low * b.low;
                     18:                if((c.low<e16) && (c.low > -e16)){
                     19:                        return(c);
                     20:                }
                     21:        }
                     22: 
                     23:        sign = 1;
                     24: 
                     25:        if((a.high<0) || (a.low<0)){
                     26:                sign = -sign;
                     27:                a.high = -a.high;
                     28:                a.low = -a.low;
                     29:        }
                     30:        if((b.high<0) || (b.low<0)){
                     31:                sign = -sign;
                     32:                b.high = -b.high;
                     33:                b.low = -b.low;
                     34:        }
                     35:        if(b.high != 0){
                     36:                mtemp = a;
                     37:                a = b;
                     38:                b = mtemp;
                     39:        }
                     40:        if(b.high!=0) ofl("mult");
                     41: 
                     42:        modf(a.low/1e8 , &a1);
                     43:        a0 = a.low - a1*1e8;
                     44:        modf(b.low/1e8 , &b1);
                     45:        b0 = b.low - b1*1e8;
                     46: 
                     47:        modf(a.high/1e8 , &a3);
                     48:        a2 = a.high - a3*1e8;
                     49: 
                     50:        temp1 = a0*b1 + a1*b0;
                     51:        modf(temp1/1e8 , &temp2);
                     52:        z.low = a0*b0 + (temp1 - temp2*1e8)*1e8;
                     53:        z.high = a1*b1 + a2*b0 + (a2*b1 + a3*b0)*1e8 + temp2;
                     54:        while(z.low >= e16){
                     55:                z.low = z.low - e16;
                     56:                z.high = z.high + 1.;
                     57:        }
                     58:        if(z.high >= e16)
                     59:                ofl("mult");
                     60:        if(a3*b1!= 0)
                     61:                ofl("mult");
                     62: 
                     63:        if(sign<0){
                     64:                z.high = -z.high;
                     65:                z.low = -z.low;
                     66:        }
                     67:        return(z);
                     68: }
                     69: 
                     70: mint
                     71: smult(a,b)
                     72: mint a;
                     73: int b;
                     74: {
                     75:        return(mult(a, itom(b)));
                     76: }
                     77: ofl(s)
                     78: char *s;
                     79: {
                     80:        printf("%s: overflow\n",s);
                     81:        abort();
                     82: }

unix.superglobalmegacorp.com

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