V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
sxshi110
V2EX  ›  Go 编程语言

go 中的 hypot 实现疑问。

  •  
  •   sxshi110 · 2019-12-11 17:47:09 +08:00 · 2831 次点击
    这是一个创建于 1591 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    请教其中有什么差别

    4 条回复    2019-12-12 12:28:06 +08:00
    wangsyi13
        1
    wangsyi13  
       2019-12-11 18:13:09 +08:00
    不知道,等大神解答。。
    gstqc
        2
    gstqc  
       2019-12-11 18:19:18 +08:00 via Android   ❤️ 1
    防止溢出
    StarUDream
        3
    StarUDream  
       2019-12-11 18:33:37 +08:00
    二楼正解,p*p+q*q 这个值可能溢出
    sxshi110
        4
    sxshi110  
    OP
       2019-12-12 12:28:06 +08:00
    @gstqc
    感谢,想想确实是这个思路。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2389 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:03 · PVG 09:03 · LAX 18:03 · JFK 21:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.