如何解决如何在Golang中将Math.Pow与整数一起使用
我一直收到错误消息“ 不能在math的参数中使用(int类型)作为float64类型。粉煤灰,在math的参数中不能使用x(int类型)作为float64类型。 无效的运算:math.Pow(a,x)%n(类型不匹配的float64和int)“
func pPrime(n int) bool {
var nm1 int = n - 1
var x int = nm1/2
a := 1;
for a < n {
if (math.Pow(a,x)) % n == nm1 {
return true
}
}
return false
}
解决方法
如果您的输入是 int
,而输出总是预期为 int
,那么您正在处理 32 位数字。编写自己的函数来处理这种乘法比使用 math.Pow
更有效。如其他答案中所述,math.Pow
需要 64 位值。
这是 15^15 的基准比较(接近 32 位表示的上限):
// IntPow calculates n to the mth power. Since the result is an int,it is assumed that m is a positive power
func IntPow(n,m int) int {
if m == 0 {
return 1
}
result := n
for i := 2; i <= m; i++ {
result *= n
}
return result
}
// MathPow calculates n to the mth power with the math.Pow() function
func MathPow(n,m int) int {
return int(math.Pow(float64(n),float64(m)))
}
结果:
go test -cpu=1 -bench=.
goos: darwin
goarch: amd64
pkg: pow
BenchmarkIntPow15 195415786 6.06 ns/op
BenchmarkMathPow15 40776524 27.8 ns/op
我认为最好的解决方案是您应该编写自己的类似于上面显示的 IntPow(m,n int)
的函数。我的基准测试表明,与使用 math.Pow
相比,它在单个 CPU 内核上的运行速度提高了 4 倍以上。
func powInt(x,y int) int {
return int(math.Pow(float64(x),float64(y)))
}
以防万一您必须重用它并使其更加干净。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。