// 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 | |
func hypot(p, q float64) float64 { | |
// special cases | |
switch { | |
case IsInf(p, 0) || IsInf(q, 0): | |
return Inf(1) | |
case IsNaN(p) || IsNaN(q): | |
return NaN() | |
} | |
p, q = Abs(p), Abs(q) | |
if p < q { | |
p, q = q, p | |
} | |
if p == 0 { | |
return 0 | |
} | |
q = q / p | |
return p * Sqrt(1+q*q) | |
} |