| // Copyright 2009 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. | |
| * See Cleve Moler and Donald Morrison, | |
| * Replacing Square Roots by Pythagorean Sums | |
| * IBM Journal of Research and Development, | |
| * Vol. 27, Number 6, pp. 577-581, Nov. 1983 | |
| */ | |
| // Hypot computes Sqrt(p*p + q*q), taking care to avoid | |
| // unnecessary overflow and underflow. | |
| func Hypot(p, q float64) float64 { | |
| if p < 0 { | |
| p = -p; | |
| } | |
| if q < 0 { | |
| q = -q; | |
| } | |
| if p < q { | |
| p, q = q, p; | |
| } | |
| if p == 0 { | |
| return 0; | |
| } | |
| pfac := p; | |
| q = q/p; | |
| r := q; | |
| p = 1; | |
| for { | |
| r = r*r; | |
| s := r+4; | |
| if s == 4 { | |
| return p*pfac; | |
| } | |
| r = r/s; | |
| p = p + 2*r*p; | |
| q = q*r; | |
| r = q/p; | |
| } | |
| panic("unreachable") | |
| } |