go 中的 hypot 实现疑问。

2019-12-11 17:47:09 +08:00
 sxshi110

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)
}

请教其中有什么差别

2966 次点击
所在节点    Go 编程语言
4 条回复
wangsyi13
2019-12-11 18:13:09 +08:00
不知道,等大神解答。。
0ZXYDDu796nVCFxq
2019-12-11 18:19:18 +08:00
防止溢出
StarUDream
2019-12-11 18:33:37 +08:00
二楼正解,p*p+q*q 这个值可能溢出
sxshi110
2019-12-12 12:28:06 +08:00
@gstqc
感谢,想想确实是这个思路。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/628077

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX