1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| // 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)
| }
|
|