hypot.go 664 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package math32
  2. /*
  3. Hypot -- sqrt(p*p + q*q), but overflows only if the result does.
  4. */
  5. // Hypot returns Sqrt(p*p + q*q), taking care to avoid
  6. // unnecessary overflow and underflow.
  7. //
  8. // Special cases are:
  9. // Hypot(±Inf, q) = +Inf
  10. // Hypot(p, ±Inf) = +Inf
  11. // Hypot(NaN, q) = NaN
  12. // Hypot(p, NaN) = NaN
  13. func Hypot(p, q float32) float32 {
  14. return hypot(p, q)
  15. }
  16. func hypot(p, q float32) float32 {
  17. // special cases
  18. switch {
  19. case IsInf(p, 0) || IsInf(q, 0):
  20. return Inf(1)
  21. case IsNaN(p) || IsNaN(q):
  22. return NaN()
  23. }
  24. if p < 0 {
  25. p = -p
  26. }
  27. if q < 0 {
  28. q = -q
  29. }
  30. if p < q {
  31. p, q = q, p
  32. }
  33. if p == 0 {
  34. return 0
  35. }
  36. q = q / p
  37. return p * Sqrt(1+q*q)
  38. }