以下代码中没有错误。
x_mean = Xdata.mean(axis=0)
x_std = Xdata.std(axis=0)
X = (Xdata-x_mean)/(x_std+0.00001)
但是当我在package main
import (
"fmt"
"math"
)
type ErrNegativeSqrt float64
func (e ErrNegativeSqrt) Error() string {
return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
}
func Sqrt(x float64) (float64, error) {
if x < 0 {
err := ErrNegativeSqrt(x)
return x, err
}
z := x
var delta = 1e-10
for {
n := z - (z*z - x) / (2*z)
if math.Abs(n - z) < delta {
break
}
z = n
}
return z, nil
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-3))
}
中更改for循环时,它会导致无限循环?
func Sqrt()
为什么有不同?
答案 0 :(得分:4)
第二个循环将是无限的,因为逻辑是有缺陷的。在这段代码中:
for {
n := z - (z*z - x) / (2*z)
if math.Abs(n - z) < delta {
z = n // here ....
break // break here
}
}
z
的值永远不会更新为新计算的值。这导致n := z - (z*z - x) / (2*z)
始终处理相同的z
,即等于x
,因为条件math.Abs(n - z) < delta
永远不会成为真。
您需要再次分配给z
,以便更新。您可以通过在循环中记录z
的值来检查这一点。示例代码:https://play.golang.org/p/9H7Uze4gip