hypot.c 599 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. /*
  2. * hypot -- sqrt(p*p+q*q), but overflows only if the result does.
  3. * See Cleve Moler and Donald Morrison,
  4. * ``Replacing Square Roots by Pythagorean Sums,''
  5. * IBM Journal of Research and Development,
  6. * Vol. 27, Number 6, pp. 577-581, Nov. 1983
  7. */
  8. #include <u.h>
  9. #include <libc.h>
  10. double
  11. hypot(double p, double q)
  12. {
  13. double r, s, pfac;
  14. if(p < 0)
  15. p = -p;
  16. if(q < 0)
  17. q = -q;
  18. if(p < q) {
  19. r = p;
  20. p = q;
  21. q = r;
  22. }
  23. if(p == 0)
  24. return 0;
  25. pfac = p;
  26. r = q = q/p;
  27. p = 1;
  28. for(;;) {
  29. r *= r;
  30. s = r+4;
  31. if(s == 4)
  32. return p*pfac;
  33. r /= s;
  34. p += 2*r*p;
  35. q *= r;
  36. r = q/p;
  37. }
  38. }