| 638 | |
| 639 | extern double f__cabsf(float, float); |
| 640 | void c_sqrt(complex *r, complex *z) |
| 641 | #endif |
| 642 | { |
| 643 | float mag; |
| 644 | |
| 645 | if( (mag = f__cabsf(z->r, z->i)) == 0.f) |
| 646 | r->r = r->i = 0.f; |
| 647 | else if(z->r > 0.0f) |
| 648 | { |
| 649 | r->r = sqrtf(0.5f * (mag + z->r) ); |
| 650 | r->i = z->i / r->r / 2.0f; |
| 651 | } |
| 652 | else |
| 653 | { |
| 654 | r->i = sqrtf(0.5f * (mag - z->r) ); |
| 655 | if(z->i < 0.0f) |
| 656 | r->i = - r->i; |
| 657 | r->r = z->i / r->i / 2.0f; |
| 658 | } |
| 659 | } |
| 660 | |
| 661 | |
| 662 | #ifdef KR_headers |