go 中的 hypot 实现源码:
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)
}
为什么不直接这样实现:
func hypot(p, q float64) float64 {
switch {
case IsInf(p, 0) || IsInf(q, 0):
return Inf(1)
case IsNaN(p) || IsNaN(q):
return NaN()
}
return Sqrt(p*p+q*q)
}
请教其中有什么差别
1
wangsyi13 2019-12-11 18:13:09 +08:00
不知道,等大神解答。。
|
2
0ZXYDDu796nVCFxq 2019-12-11 18:19:18 +08:00 via Android 1
防止溢出
|
3
StarUDream 2019-12-11 18:33:37 +08:00
二楼正解,p*p+q*q 这个值可能溢出
|