1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)z_sqrt.c 5.3 01/15/91 7 */ 8 9 #include "complex" 10 #ifdef tahoe 11 #include <tahoe/math/FP.h> 12 #define cabs zabs 13 #endif 14 15 z_sqrt(r, z) 16 dcomplex *r, *z; 17 { 18 double mag, sqrt(), cabs(); 19 20 if( (mag = cabs(z->dreal, z->dimag)) == 0.) 21 r->dreal = r->dimag = 0.; 22 else if(z->dreal > 0) 23 { 24 r->dreal = sqrt(0.5 * (mag + z->dreal) ); 25 r->dimag = z->dimag / r->dreal / 2; 26 } 27 else 28 { 29 r->dimag = sqrt(0.5 * (mag - z->dreal) ); 30 if(z->dimag < 0) 31 #ifndef tahoe 32 r->dimag = - r->dimag; 33 #else tahoe 34 *((long int *)&r->dimag) ^= SIGN_BIT; 35 #endif tahoe 36 r->dreal = z->dimag / r->dimag / 2; 37 } 38 } 39