Annotation of 3BSD/cmd/apl/ao.c, revision 1.1.1.1

1.1       root        1: #include "apl.h"
                      2: 
                      3: data
                      4: ex_add(d1, d2)
                      5: data d1, d2;
                      6: {
                      7: 
                      8:        if(fuzz(d1, -d2) == 0)
                      9:                return(zero);
                     10:        return(d1 + d2);
                     11: }
                     12: 
                     13: data
                     14: ex_sub(d1, d2)
                     15: data d1, d2;
                     16: {
                     17: 
                     18:        if(fuzz(d1, d2) == 0)
                     19:                return(zero);
                     20:        return(d1 - d2);
                     21: }
                     22: 
                     23: data
                     24: ex_mul(d1, d2)
                     25: data d1, d2;
                     26: {
                     27:        return(d1 * d2);
                     28: }
                     29: 
                     30: data
                     31: ex_div(d1, d2)
                     32: data d1, d2;
                     33: {
                     34: 
                     35:        /* 0 div 0 is NOT 1 */
                     36:        if(d2 == zero)
                     37:                error("div D");
                     38:        return(d1 / d2);
                     39: }
                     40: 
                     41: data
                     42: ex_mod(d1, d2)
                     43: data d1, d2;
                     44: {
                     45:        double f;
                     46: 
                     47:        /* see 0 div 0 comment */
                     48:        if(d1 == zero)
                     49:                error("mod D");
                     50:        if(d1 < zero)
                     51:                d1 = -d1;
                     52:        f = d2;
                     53:        d2 = d2 - d1 * floor(f/d1);
                     54:        return(d2);
                     55: }
                     56: 
                     57: data
                     58: ex_min(d1, d2)
                     59: data d1, d2;
                     60: {
                     61: 
                     62:        if(d1 < d2)
                     63:                return(d1);
                     64:        return(d2);
                     65: }
                     66: 
                     67: data
                     68: ex_max(d1, d2)
                     69: data d1, d2;
                     70: {
                     71: 
                     72:        if(d1 > d2)
                     73:                return(d1);
                     74:        return(d2);
                     75: }
                     76: 
                     77: data
                     78: ex_pwr(d1, d2)
                     79: data d1, d2;
                     80: {
                     81:        register s;
                     82:        double f1;
                     83: 
                     84:        s = 0;
                     85:        f1 = d1;
                     86:        if(f1 > 0.) {
                     87:                f1 = d2 * log(f1);
                     88:                goto chk;
                     89:        }
                     90:        if(f1 == 0.) {
                     91:                if(d2 == zero)
                     92:                        goto bad;
                     93:                return(zero);
                     94:        }
                     95:        /* should check rational d2 here */
                     96:        goto bad;
                     97: 
                     98: chk:
                     99:        if(f1 < maxexp) {
                    100:                d1 = exp(f1);
                    101:                if(s)
                    102:                        d1 = -d1;
                    103:                return(d1);
                    104:        }
                    105: bad:
                    106:        error("pwr D");
                    107: }
                    108: 
                    109: data
                    110: ex_log(d1, d2)
                    111: data d1, d2;
                    112: {
                    113:        double f1, f2;
                    114: 
                    115:        f1 = d1;
                    116:        f2 = d2;
                    117:        if(f1 <= 0. || f2 <= 0.)
                    118:                error("log D");
                    119:        d1 = log(f2)/log(f1);
                    120:        return(d1);
                    121: }
                    122: 
                    123: data
                    124: ex_cir(d1, d2)
                    125: data d1, d2;
                    126: {
                    127:        double f, f1;
                    128: 
                    129:        switch(fix(d1)) {
                    130: 
                    131:        default:
                    132:                error("crc D");
                    133: 
                    134:        case -7:
                    135:                /* arc tanh */
                    136:                f = d2;
                    137:                if(f <= -1. || f >= 1.)
                    138:                        error("tanh D");
                    139:                f = log((1.+f)/(1.-f))/2.;
                    140:                goto ret;
                    141: 
                    142:        case -6:
                    143:                /* arc cosh */
                    144:                f = d2;
                    145:                if(f < 1.)
                    146:                        error("cosh D");
                    147:                f = log(f+sqrt(f*f-1.));
                    148:                goto ret;
                    149: 
                    150:        case -5:
                    151:                /* arc sinh */
                    152:                f = d2;
                    153:                f = log(f+sqrt(f*f+1.));
                    154:                goto ret;
                    155: 
                    156:        case -4:
                    157:                /* sqrt(-1 + x*x) */
                    158:                f = -one + d2*d2;
                    159:                goto sq;
                    160: 
                    161:        case -3:
                    162:                /* arc tan */
                    163:                f = d2;
                    164:                f = atan(f);
                    165:                goto ret;
                    166: 
                    167:        case -2:
                    168:                /* arc cos */
                    169:                f = d2;
                    170:                if(f < -1. || f > 1.)
                    171:                        error("arc cos D");
                    172:                f = atan2(sqrt(1.-f*f), f);
                    173:                goto ret;
                    174: 
                    175:        case -1:
                    176:                /* arc sin */
                    177:                f = d2;
                    178:                if(f < -1. || f > 1.)
                    179:                        error("arc sin D");
                    180:                f = atan2(f, sqrt(1.-f*f));
                    181:                goto ret;
                    182: 
                    183:        case 0:
                    184:                /* sqrt(1 - x*x) */
                    185:                f = one - d2*d2;
                    186:                goto sq;
                    187: 
                    188:        case 1:
                    189:                /* sin */
                    190:                f = d2;
                    191:                f = sin(f);
                    192:                goto ret;
                    193: 
                    194:        case 2:
                    195:                /* cos */
                    196:                f = d2;
                    197:                f = cos(f);
                    198:                goto ret;
                    199: 
                    200:        case 3:
                    201:                /* tan */
                    202:                f = d2;
                    203:                f1 = cos(f);
                    204:                if(f1 == 0.)
                    205:                        f = exp(maxexp); else
                    206:                        f = sin(f)/f1;
                    207:                goto ret;
                    208: 
                    209:        case 4:
                    210:                /* sqrt(1 + x*x) */
                    211:                f = one + d2*d2;
                    212:                goto sq;
                    213: 
                    214:        case 5:
                    215:                /* sinh */
                    216:                f = d2;
                    217:                if(f < -maxexp || f > maxexp)
                    218:                        error("sinh D");
                    219:                f = exp(f);
                    220:                f = (f-1./f)/2.;
                    221:                goto ret;
                    222: 
                    223:        case 6:
                    224:                /* cosh */
                    225:                f = d2;
                    226:                if(f < -maxexp || f > maxexp)
                    227:                        error("cosh D");
                    228:                f = exp(f);
                    229:                f = (f+1./f)/2.;
                    230:                goto ret;
                    231: 
                    232:        case 7:
                    233:                /* tanh */
                    234:                f = d2;
                    235:                if(f > maxexp) {
                    236:                        f = 1.;
                    237:                        goto ret;
                    238:                }
                    239:                if(f < -maxexp) {
                    240:                        f = -1.;
                    241:                        goto ret;
                    242:                }
                    243:                f = exp(f);
                    244:                f = (f-1./f)/(f+1./f);
                    245:                goto ret;
                    246:        }
                    247: 
                    248: sq:
                    249:        if(f < 0.)
                    250:                error("sqrt D");
                    251:        f = sqrt(f);
                    252: 
                    253: ret:
                    254:        d1 = f;
                    255:        return(d1);
                    256: }
                    257: 
                    258: data
                    259: ex_comb(d1, d2)
                    260: data d1, d2;
                    261: {
                    262:        double f;
                    263: 
                    264:        if(d1 > d2)
                    265:                return(zero);
                    266:        f = gamma(d2+1.) - gamma(d1+1.) - gamma(d2-d1+1.);
                    267:        if(f > maxexp)
                    268:                error("comb D");
                    269:        d1 = exp(f);
                    270:        return(d1);
                    271: }
                    272: 
                    273: data
                    274: ex_and(d1, d2)
                    275: data d1, d2;
                    276: {
                    277: 
                    278:        if(d1!=zero && d2!=zero)
                    279:                return(one);
                    280:        return(zero);
                    281: }
                    282: 
                    283: data
                    284: ex_or(d1, d2)
                    285: data d1, d2;
                    286: {
                    287: 
                    288:        if(d1!=zero || d2!=zero)
                    289:                return(one);
                    290:        return(zero);
                    291: }
                    292: 
                    293: data
                    294: ex_nand(d1, d2)
                    295: data d1, d2;
                    296: {
                    297: 
                    298:        if(d1!=zero && d2!=zero)
                    299:                return(zero);
                    300:        return(one);
                    301: }
                    302: 
                    303: data
                    304: ex_nor(d1, d2)
                    305: data d1, d2;
                    306: {
                    307: 
                    308:        if(d1!=zero || d2!=zero)
                    309:                return(zero);
                    310:        return(one);
                    311: }
                    312: 
                    313: data
                    314: ex_lt(d1, d2)
                    315: data d1, d2;
                    316: {
                    317: 
                    318:        if(fuzz(d1, d2) < 0)
                    319:                return(one);
                    320:        return(zero);
                    321: }
                    322: 
                    323: data
                    324: ex_le(d1, d2)
                    325: data d1, d2;
                    326: {
                    327: 
                    328:        if(fuzz(d1, d2) <= 0)
                    329:                return(one);
                    330:        return(zero);
                    331: }
                    332: 
                    333: data
                    334: ex_eq(d1, d2)
                    335: data d1, d2;
                    336: {
                    337: 
                    338:        if(fuzz(d1, d2) == 0)
                    339:                return(one);
                    340:        return(zero);
                    341: }
                    342: 
                    343: data
                    344: ex_ge(d1, d2)
                    345: data d1, d2;
                    346: {
                    347: 
                    348:        if(fuzz(d1, d2) >= 0)
                    349:                return(one);
                    350:        return(zero);
                    351: }
                    352: 
                    353: data
                    354: ex_gt(d1, d2)
                    355: data d1, d2;
                    356: {
                    357: 
                    358:        if(fuzz(d1, d2) > 0)
                    359:                return(one);
                    360:        return(zero);
                    361: }
                    362: 
                    363: data
                    364: ex_ne(d1, d2)
                    365: data d1, d2;
                    366: {
                    367: 
                    368:        if(fuzz(d1, d2) != 0)
                    369:                return(one);
                    370:        return(zero);
                    371: }
                    372: 
                    373: data
                    374: ex_plus(d)
                    375: data d;
                    376: {
                    377: 
                    378:        return(d);
                    379: }
                    380: 
                    381: data
                    382: ex_minus(d)
                    383: data d;
                    384: {
                    385: 
                    386:        return(-d);
                    387: }
                    388: 
                    389: data
                    390: ex_sgn(d)
                    391: data d;
                    392: {
                    393: 
                    394:        if(d == zero)
                    395:                return(zero);
                    396:        if(d < zero)
                    397:                return(-one);
                    398:        return(one);
                    399: }
                    400: 
                    401: data
                    402: ex_recip(d)
                    403: data d;
                    404: {
                    405: 
                    406:        if(d == zero)
                    407:                error("recip D");
                    408:        return(one/d);
                    409: }
                    410: 
                    411: data
                    412: ex_abs(d)
                    413: data d;
                    414: {
                    415: 
                    416:        if(d < zero)
                    417:                return(-d);
                    418:        return(d);
                    419: }
                    420: 
                    421: data
                    422: ex_floor(d)
                    423: data d;
                    424: {
                    425: 
                    426:        d = floor(d + thread.fuzz);
                    427:        return(d);
                    428: }
                    429: 
                    430: data
                    431: ex_ceil(d)
                    432: data d;
                    433: {
                    434: 
                    435:        d = ceil(d - thread.fuzz);
                    436:        return(d);
                    437: }
                    438: 
                    439: data
                    440: ex_exp(d)
                    441: data d;
                    442: {
                    443:        double f;
                    444: 
                    445:        f = d;
                    446:        if(f > maxexp)
                    447:                error ("exp D");
                    448:        d = exp(f);
                    449:        return(d);
                    450: }
                    451: 
                    452: data
                    453: ex_loge(d)
                    454: data d;
                    455: {
                    456:        double f;
                    457: 
                    458:        f = d;
                    459:        if(f <= 0.)
                    460:                error("log D");
                    461:        d = log(f);
                    462:        return(d);
                    463: }
                    464: 
                    465: data
                    466: ex_pi(d)
                    467: data d;
                    468: {
                    469: 
                    470:        d = pi * d;
                    471:        return(d);
                    472: }
                    473: 
                    474: data
                    475: ex_rand(d)
                    476: data d;
                    477: {
                    478:        double f;
                    479: 
                    480:        f = (rand()/(32768.*32768.*2.)) * d;
                    481:        d = floor(f) + thread.iorg;
                    482:        return(d);
                    483: }
                    484: 
                    485: data
                    486: ex_fac(d)
                    487: data d;
                    488: {
                    489:        double f;
                    490: 
                    491:        f = gamma(d+1.);
                    492:        if(f > maxexp)
                    493:                error("fac D");
                    494:        d = exp(f);
                    495:        if(signgam == -1)
                    496:                d = -d;
                    497:        return(d);
                    498: }
                    499: 
                    500: data
                    501: ex_not(d)
                    502: data d;
                    503: {
                    504: 
                    505:        if(d == zero)
                    506:                return(one);
                    507:        return(zero);
                    508: }

unix.superglobalmegacorp.com

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