Annotation of researchv10no/cmd/cfront/libC/complex/log.c, revision 1.1.1.1

1.1       root        1: 
                      2: #include "complex.h"
                      3: #include "const.h"
                      4: 
                      5: #define        LOGWILD -1000
                      6: #define        LOGDANGER       1e18
                      7: #define PERIL(t) (t > LOGDANGER || (t < 1/LOGDANGER && t != 0) )
                      8: 
                      9: complex log(complex z)
                     10: /*
                     11:        The complex natural logarithm of "z".
                     12:        If z = 0, then the answer LOGWILD + 0*i is returned.
                     13: 
                     14:        Stu Feldman says that the peril tests for the following function
                     15:        are "acceptable for now", but certain things like
                     16:        complex variables outside the over/underflow range 
                     17:        will cause floating exceptions.
                     18: */
                     19: {
                     20:        complex answer; 
                     21:        double  partial;
                     22: 
                     23:        if ( z.re == 0 && z.im == 0) {
                     24:                complex_error(C_LOG_0,0);
                     25:                answer.re = LOGWILD;
                     26:        }
                     27:        else {
                     28:        /*
                     29:                 Check for (over/under)flow, and fixup if necessary.
                     30:        */
                     31:                double x = ABS(z.re);
                     32:                double y = ABS(z.im);
                     33:     
                     34:                if ( x>y && PERIL(x) ) {
                     35:                        z.im /=x;
                     36:                        z.re /= x;  /* z.re is replaced by 1 or -1 */
                     37:                        partial = log(x);
                     38:                }
                     39:                else if (PERIL(y)) {
                     40:                        z.im /= y;  /* roles of re, im reversed from previous */
                     41:                        z.re /= y;
                     42:                        partial = log(y);
                     43:                        }
                     44:                else partial = 0;
                     45:     
                     46:        /*
                     47:                z.re*z.re and z.im*z.im should not cause problems now.
                     48:        */
                     49:     
                     50:                answer.im = atan2(z.im,z.re); 
                     51:                answer.re = log(z.re*z.re + z.im*z.im)/2 + partial;
                     52:        }
                     53:        return answer;
                     54: }

unix.superglobalmegacorp.com

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