Golang Go语言中的 hypot 实现疑问
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 回复
防止溢出
二楼正解,pp+qq 这个值可能溢出
感谢,想想确实是这个思路。
在Go语言中,hypot
函数通常用于计算两个浮点数的直角三角形的斜边长度,即欧几里得范数或向量的长度。这个函数在标准库 math
包中并未直接提供,但你可以通过 math.Sqrt
和 math.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
类型的参数 x
和 y
,并返回它们的斜边长度。在 main
函数中,我们计算了一个直角三角形的斜边长度,其中直角边分别为3和4,结果应为5。
值得注意的是,虽然Go标准库没有直接提供 hypot
函数,但一些第三方数学库可能包含了这一功能,你可以根据自己的需求选择是否使用这些库。此外,在某些情况下,直接使用 math.Sqrt
和 math.Pow
的组合可能是更灵活和可控的选择。