| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- package math32
- /*
- Hypot -- sqrt(p*p + q*q), but overflows only if the result does.
- */
- // Hypot returns Sqrt(p*p + q*q), taking care to avoid
- // unnecessary overflow and underflow.
- //
- // Special cases are:
- // Hypot(±Inf, q) = +Inf
- // Hypot(p, ±Inf) = +Inf
- // Hypot(NaN, q) = NaN
- // Hypot(p, NaN) = NaN
- func Hypot(p, q float32) float32 {
- return hypot(p, q)
- }
- func hypot(p, q float32) float32 {
- // special cases
- switch {
- case IsInf(p, 0) || IsInf(q, 0):
- return Inf(1)
- case IsNaN(p) || IsNaN(q):
- return NaN()
- }
- if p < 0 {
- p = -p
- }
- if q < 0 {
- q = -q
- }
- if p < q {
- p, q = q, p
- }
- if p == 0 {
- return 0
- }
- q = q / p
- return p * Sqrt(1+q*q)
- }
|