Golang Go语言中的 hypot 实现疑问

发布于 1周前 作者 gougou168 来自 Go语言

Golang Go语言中的 hypot 实现疑问

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

请教其中有什么差别


更多关于Golang Go语言中的 hypot 实现疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

不知道,等大神解答。。

更多关于Golang Go语言中的 hypot 实现疑问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


二楼正解,pp+qq 这个值可能溢出


感谢,想想确实是这个思路。

在Go语言中,hypot 函数通常用于计算两个浮点数的直角三角形的斜边长度,即欧几里得范数或向量的长度。这个函数在标准库 math 包中并未直接提供,但你可以通过 math.Sqrtmath.Pow 函数组合来实现类似的功能。

hypot(x, y) 的数学定义是 sqrt(x^2 + y^2),因此你可以自己编写一个函数来实现它:

package main

import (
    "fmt"
    "math"
)

func hypot(x, y float64) float64 {
    return math.Sqrt(math.Pow(x, 2) + math.Pow(y, 2))
}

func main() {
    x := 3.0
    y := 4.0
    result := hypot(x, y)
    fmt.Printf("The hypotenuse of the right triangle with legs %v and %v is %v\n", x, y, result)
}

这段代码定义了一个 hypot 函数,它接受两个 float64 类型的参数 xy,并返回它们的斜边长度。在 main 函数中,我们计算了一个直角三角形的斜边长度,其中直角边分别为3和4,结果应为5。

值得注意的是,虽然Go标准库没有直接提供 hypot 函数,但一些第三方数学库可能包含了这一功能,你可以根据自己的需求选择是否使用这些库。此外,在某些情况下,直接使用 math.Sqrtmath.Pow 的组合可能是更灵活和可控的选择。

回到顶部