| // Copyright 2010 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package math |
| |
| /* |
| 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 float64) float64 { |
| if haveArchHypot { |
| return archHypot(p, q) |
| } |
| return hypot(p, q) |
| } |
| |
| func hypot(p, q float64) float64 { |
| p, q = Abs(p), Abs(q) |
| // special cases |
| switch { |
| case IsInf(p, 1) || IsInf(q, 1): |
| return Inf(1) |
| case IsNaN(p) || IsNaN(q): |
| return NaN() |
| } |
| if p < q { |
| p, q = q, p |
| } |
| if p == 0 { |
| return 0 |
| } |
| q = q / p |
| return p * Sqrt(1+q*q) |
| } |